目录
MySQL服务器(mysqld)是执行MySQL安装中大部分工作的主要程序。本章概述了MySQL服务器并涵盖了一般服务器管理:
服务器配置
数据目录,特别是mysql
系统数据库
服务器日志文件
在一台机器上管理多台服务器
有关管理主题的其他信息,另请参阅:
mysqld是MySQL服务器。以下讨论涵盖了这些MySQL服务器配置主题:
服务器支持的启动选项。您可以在命令行上,通过配置文件或两者都指定这些选项。
服务器系统变量。这些变量反映了启动选项的当前状态和值,其中一些可以在服务器运行时修改。
服务器状态变量。这些变量包含运行时操作的计数器和统计信息
如何设置服务器SQL模式。此设置修改SQL语法和语义的某些方面,例如与其他数据库系统的代码兼容,或者控制特定情况下的错误处理。
配置和使用IPv6支持。
配置和使用时区支持。
服务器端帮助功能。
服务器关机过程。根据表的类型(事务性或非事务性)以及是否使用复制,存在性能和可靠性方面的考虑。
有关在MySQL 5.7中添加,弃用或删除的MySQL服务器变量和选项列表,请参见 第1.5节“在MySQL 5.7中添加,弃用或删除服务器和状态变量和选项”。
并非所有的MySQL服务器二进制文件和配置都支持所有的存储引擎。要了解如何确定MySQL服务器安装支持哪些存储引擎,请参见 第13.7.5.16节“SHOW ENGINES语法”。
MySQL服务器mysqld具有许多命令选项和系统变量,可以在启动时设置它们以配置其操作。要确定服务器使用的命令选项和系统变量值,请执行以下命令:
外壳> mysqld --verbose --help
该命令会生成所有mysqld 选项和可配置系统变量的列表。它的输出包含默认选项和变量值,如下所示:
abort-slave-event-count 0 allow-suspicious-udfs FALSE 存档ON 自动递增1 自动增量偏移1 自动提交TRUE 自动sp-privileges TRUE avoid-temporal-upgrade FALSE 返回日志80 basedir /home/jon/bin/mysql-5.7/ ... tmpdir / tmp transaction-alloc-block-size 8192 事务隔离REPEATABLE-READ transaction-prealloc-size 4096 事务只读FALSE 事务写入集提取OFF 可更新视图与限制是 validate-user-plugins TRUE 详细为TRUE 等待超时28800
要查看服务器在运行时使用的当前系统变量值,请连接到它并执行以下语句:
MySQL的> SHOW VARIABLES;
要查看正在运行的服务器的一些统计和状态指示器,请执行以下语句:
MySQL的> SHOW STATUS;
系统变量和状态信息也可以通过 mysqladmin命令获得:
shell>mysqladmin variablesshell>mysqladmin extended-status
有关所有命令选项,系统变量和状态变量的完整说明,请参阅以下部分:
更详细的监控信息可从性能模式获得; 请参阅第25章MySQL性能架构。
MySQL使用非常具有伸缩性的算法,因此通常可以使用很少的内存运行。但是,通常给MySQL提供更多的内存会带来更好的性能。
在调整MySQL服务器时,配置的两个最重要的变量是key_buffer_size和
table_open_cache。在尝试更改任何其他变量之前,您应该先确信自己已经设置了这些设置。
以下示例显示了不同运行时配置的一些典型变量值。
如果你有至少1-2GB的内存和许多表,并希望用中等数量的客户端获得最大性能,请使用如下所示的内容:
外壳>mysqld_safe --key_buffer_size=384M --table_open_cache=4000 \--sort_buffer_size=4M --read_buffer_size=1M &
如果你只有256MB的内存和只有几张表,但你仍然做了很多的排序,你可以使用这样的东西:
外壳> mysqld_safe --key_buffer_size=64M --sort_buffer_size=1M
如果有很多同时连接,除非mysqld已配置为每个连接使用很少的内存,否则可能会发生交换问题。 如果你有足够的内存用于所有连接,mysqld性能会更好。
只需很少的内存和大量的连接,使用这样的东西:
外壳>mysqld_safe --key_buffer_size=512K --sort_buffer_size=100K \--read_buffer_size=100K &
甚至这个:
外壳>mysqld_safe --key_buffer_size=512K --sort_buffer_size=16K \--table_open_cache=32 --read_buffer_size=8K \--net_buffer_length=1K &
如果您对比可用内存大得多的表执行GROUP BY或
ORDER BY操作,请增加值
read_rnd_buffer_size以加快排序操作后的行读取速度。
如果您在命令行上为mysqld或mysqld_safe指定了一个选项 ,则它仅在调用服务器时才有效。要在每次运行服务器时使用该选项,请将其放入选项文件中。请参见第4.2.6节“使用选项文件”。
MySQL服务器有许多操作参数,您可以在服务器启动时使用命令行选项或配置文件(选项文件)更改这些参数。在运行时也可以更改许多参数。有关在启动时或运行时设置参数的一般说明,请参见 第5.1.4节“服务器命令选项”和 第5.1.5节“服务器系统变量”。
在Windows上,MySQL安装程序与用户交互,并创建一个名为my.ini基本安装目录的文件作为默认选项文件。如果您从Zip存档安装在Windows上,则可以将my-default.ini模板文件复制
到基本安装目录中,my.ini并将后者用作默认选项文件。
从MySQL 5.7.18开始,my-default.ini不再包含或由分发包安装。
在Windows上,可能不会显示.ini或
.cnf选项文件扩展名。
完成安装过程后,您可以随时编辑默认选项文件以修改服务器使用的参数。例如,要在文件中使用参数设置,在#该行的开头使用字符注释,请删除#该参数,并根据需要修改参数值。要禁用设置,请将一个添加#到该行的开头或将其删除。
对于非Windows平台,在服务器安装或数据目录初始化过程中不会创建默认选项文件。按照第4.2.6节“使用选项文件”中的说明创建选项文件。如果没有选项文件,服务器仅以其默认设置启动 - 请参见第5.1.2节“服务器配置默认值” ,了解如何检查这些设置。
有关选项文件格式和语法的更多信息,请参见第4.2.6节“使用选项文件”。
下表提供了所有命令行选项,服务器和状态变量适用的列表
mysqld。
该表在一个统一列表中列出了命令行选项(Cmd-line),配置文件(选项文件),服务器系统变量(System Var)和状态变量(Status var)中有效的选项,并通知每个选项/变量是有效的。如果在命令行或选项文件中设置的服务器选项与相应服务器系统或状态变量的名称不同,则会在相应选项的下方标记变量名称。对于状态变量,变量的范围显示为(范围)为全局,会话或两者。有关设置和使用选项和变量的详细信息,请参阅相应部分。在适当的情况下,直接链接到该项目的更多信息。
有关特定于NDB集群的此表的版本,请参见 第21.3.2.5节“NDB集群mysqld选项和变量引用”。
表5.1选项和变量摘要
笔记:
1.此选项是动态的,但只有服务器应设置此信息。你不应该手动设置这个变量的值。
启动mysqld服务器时,可以使用第4.2.3节“指定程序选项”中介绍的任何方法 指定程序选项。最常见的方法是在选项文件或命令行中提供选项。但是,在大多数情况下,确保服务器每次运行时都使用相同的选项。确保这一点的最好方法是将它们列在选项文件中。请参见 第4.2.6节“使用选项文件”。该部分还介绍选项文件格式和语法。
mysqld读取[mysqld]和[server]
组中的选项
。mysqld_safe的读取选项
[mysqld],[server],
[mysqld_safe],和
[safe_mysqld]团体。
mysql.server读取[mysqld]和[mysql.server]
组中的选项
。
嵌入式MySQL服务器通常读取选项
[server],[embedded]和
团体,其中是到其中的服务器嵌入的应用程序的名称。
[xxxxx_SERVER]xxxxx
mysqld接受许多命令选项。对于一个简短的总结,执行这个命令:
mysqld --help
要查看完整列表,请使用以下命令:
mysqld --verbose --help
列表中的一些项目实际上是可以在服务器启动时设置的系统变量。这些可以在运行时使用该SHOW VARIABLES语句显示。前面的mysqld
命令显示的某些项目不会出现在SHOW
VARIABLES输出中; 这是因为它们只是选项而不是系统变量。
以下列表显示了一些最常用的服务器选项。其他部分介绍其他选项:
影响安全性的选项:请参见 第6.1.4节“安全性相关的mysqld选项和变量”。
SSL相关选项:请参见 第6.4.2节“加密连接的命令选项”。
二进制日志控制选项:请参见第5.4.4节“二进制日志”。
与复制相关的选项:请参见 第16.1.6节“复制和二进制日志记录选项和变量”。
加载插件的选项,如可插拔存储引擎:请参见第5.5.1节“安装和卸载插件”。
特定于特定存储引擎的选项:请参见 第14.14节“InnoDB启动选项和系统变量”和 第15.2.1节“MyISAM启动选项”。
一些选项控制缓冲区或缓存的大小。对于给定的缓冲区,服务器可能需要分配内部数据结构。这些结构通常是从分配给缓冲区的总内存中分配的,而所需的空间量可能与平台有关。这意味着,当您为控制缓冲区大小的选项分配值时,实际可用的空间量可能与分配的值不同。在某些情况下,金额可能小于指定的金额。服务器也可能会向上调整一个值。例如,如果将值0赋予最小值为1024的选项,则服务器将将值设置为1024。
除非另有说明,缓冲区大小,长度和堆栈大小的值以字节为单位给出。
一些选项采用文件名称值。除非另有说明,否则如果该值是相对路径名称,则默认文件位置是数据目录。要明确指定位置,请使用绝对路径名称。假设数据目录是
/var/mysql/data。如果文件值选项是作为相对路径名给出的,它将位于下方
/var/mysql/data。如果该值是绝对路径名,则其位置如路径名所示。
您也可以在服务器启动时通过使用变量名称作为选项来设置服务器系统变量的值。要将值分配给服务器系统变量,请使用表单的选项
。例如,
将该变量设置
为384MB的值。
--var_name=value--sort_buffer_size=384Msort_buffer_size
当你给一个变量赋值时,MySQL可能会自动修正该值以保持在给定范围内,或者如果只允许某些值,则将该值调整到最接近的允许值。
要限制在运行时可以用SET
语句设置系统变量的
最大值,请使用
服务器启动时表单的选项指定此最大值
。
--maximum-var_name=value
您可以使用该SET
语句在运行时更改大多数系统变量的值。请参见第13.7.4.1节“变量赋值的SET语法”。
第5.1.5节“服务器系统变量”提供了所有变量的完整描述以及在服务器启动和运行时设置它们的附加信息。有关更改系统变量的信息,请参见 第5.1.1节“配置服务器”。
--help, -?
| 属性 | 值 |
|---|---|
| 命令行格式 | --help |
| 属性 | 值 |
|---|---|
| 命令行格式 | --allow-suspicious-udfs |
| 类型 | 布尔 |
| 默认 | FALSE |
该选项控制是否xxx可以加载仅具有主函数符号的用户定义函数。默认情况下,该选项关闭,只能加载至少有一个辅助符号的UDF; 这可以防止尝试从除包含合法UDF的共享对象文件之外的共享对象文件加载功能。请参见
第28.4.2.6节“UDF安全注意事项”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ansi |
使用标准(ANSI)SQL语法而不是MySQL语法。要更精确地控制服务器SQL模式,请--sql-mode改为使用该
选项。请参阅
第1.8节“MySQL标准合规性”和
第5.1.8节“服务器SQL模式”。
--basedir=,
dir_name-b
dir_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --basedir=dir_name |
| 系统变量 | basedir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
MySQL安装目录的路径。该选项设置basedir系统变量。
| 属性 | 值 |
|---|---|
| 命令行格式 | --big-tables |
| 系统变量 | big_tables |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
通过将所有临时集保存在文件中来启用大型结果集。此选项可防止大多数“ 表满 ” 错误,但也会减慢内存表可满足的查询速度。服务器能够使用小型临时表的内存自动处理大型结果集,并在必要时切换到磁盘表。
| 属性 | 值 |
|---|---|
| 命令行格式 | --bind-address=addr |
| 系统变量 | bind_address |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
| 默认 | * |
MySQL服务器在单个网络套接字上侦听TCP / IP连接。该套接字绑定到单个地址,但地址可能映射到多个网络接口。要指定地址,请
在服务器启动时使用该
选项,其中
是IPv4或IPv6地址或主机名。如果是主机名称,则服务器将名称解析为IP地址并绑定到该地址。
--bind-address=addraddraddr
服务器如下处理不同类型的地址:
如果地址是*,则服务器在所有服务器主机IPv6和IPv4接口上接受TCP / IP连接(如果服务器主机支持IPv6),否则接受所有IPv4地址上的TCP / IP连接。使用此地址允许所有服务器接口上的IPv4和IPv6连接。该值是默认值。
如果地址是0.0.0.0,则服务器接受所有服务器主机IPv4接口上的TCP / IP连接。
如果地址是::,则服务器接受所有服务器主机IPv4和IPv6接口上的TCP / IP连接。
如果地址是IPv4映射地址,则服务器接受IPv4或IPv6格式的该地址的TCP / IP连接。例如,如果服务器绑定::ffff:127.0.0.1,客户端可以使用--host=127.0.0.1或
连接--host=::ffff:127.0.0.1。
如果地址是“ 常规 ” IPv4或IPv6地址(如127.0.0.1或
::1),则服务器仅接受该IPv4或IPv6地址的TCP / IP连接。
如果您打算将服务器绑定到特定地址,请确保mysql.user授权表中包含具有可用于连接到该地址的管理权限的帐户。否则,您将无法关闭服务器。例如,如果将服务器绑定到*,则可以使用所有现有帐户连接到该服务器。但是如果你绑定了服务器
::1,它只接受该地址上的连接。在这种情况下,首先确保
'root'@'::1'帐户存在于
mysql.user表中,这样您仍然可以连接到服务器以将其关闭。
--binlog-format={ROW|STATEMENT|MIXED}
| 属性 | 值 |
|---|---|
| 命令行格式 | --binlog-format=format |
| 系统变量 | binlog_format |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认(> = 5.7.7) | ROW |
| 默认(<= 5.7.6) | STATEMENT |
| 有效值 |
|
指定是使用基于行的,基于语句的还是混合的复制。基于语句是MySQL 5.7中的默认设置。请参见第16.2.1节“复制格式”。
在某些情况下,在运行时更改此变量是不可能的,或导致复制失败。有关更多信息,请参见 第5.4.4.2节“设置二进制日志格式”。
设置二进制日志记录格式而不启用二进制日志记录会设置
binlog_format全局系统变量并记录警告。
| 属性 | 值 |
|---|---|
| 命令行格式 | --bootstrap |
| 弃用 | 5.7.6 |
mysql_install_db 程序 使用此选项创建MySQL特权表,而无需启动完整的MySQL服务器。
不推荐使用 mysql_install_db,因为它的功能已经集成到
MySQL服务器 mysqld中。因此, mysql_install_db传递给
mysqld的--bootstrap服务器选项也被弃用。要初始化MySQL安装,请使用或
选项调用 mysqld。有关更多信息,请参见
第2.10.1.1节“使用mysqld手动初始化数据目录”。
mysql_install_db和
服务器选项将在未来的MySQL版本中被删除。
--initialize--initialize-insecure--bootstrap
--bootstrap是相互排斥的--daemonize,
--initialize和
--initialize-insecure。
全局事务标识符(GTID)在--bootstrap使用时不会被禁用
。
--bootstrap被使用(Bug#20980271)。请参见第16.1.3节“使用全局事务标识符进行复制”。
当服务器以引导模式运行时,某些功能不可用,从而限制了该--init-file选项指定的任何文件中允许的语句。有关更多信息,请参阅该选项的说明。另外,
disabled_storage_engines
系统变量不起作用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --character-sets-dir=dir_name |
| 系统变量 | character_sets_dir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
安装字符集的目录。请参见 第10.14节“字符集配置”。
--character-set-client-handshake
| 属性 | 值 |
|---|---|
| 命令行格式 | --character-set-client-handshake |
| 类型 | 布尔 |
| 默认 | TRUE |
不要忽略客户端发送的字符集信息。要忽略客户端信息并使用默认服务器字符集,请使用
--skip-character-set-client-handshake; 这使得MySQL像MySQL 4.0一样行事。
--character-set-filesystem=
charset_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --character-set-filesystem=name |
| 系统变量 | character_set_filesystem |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | binary |
文件系统字符集。该选项设置
character_set_filesystem
系统变量。
--character-set-server=,
charset_name-C
charset_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --character-set-server |
| 系统变量 | character_set_server |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | latin1 |
使用charset_name作为默认服务器字符集。请参见
第10.14节“字符集配置”。如果使用此选项指定非默认字符集,则还应该使用--collation-server指定排序规则。
--chroot=,
dir_name-r
dir_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --chroot=dir_name |
| 类型 | 目录名称 |
使用系统调用在启动期间
将mysqld服务器置于一个封闭的环境中
chroot()。这是推荐的安全措施。这个选项的使用有些限制
LOAD DATA
INFILE和
SELECT ... INTO
OUTFILE。
--collation-server=
collation_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --collation-server |
| 系统变量 | collation_server |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | latin1_swedish_ci |
使用collation_name作为默认的服务器排序规则。请参见第10.14节“字符集配置”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --console |
| 平台特定 | 视窗 |
(仅限Windows。)将错误日志写入
stderr和stdout(控制台)。如果使用此选项,mysqld不会关闭控制台窗口。
--console--log-error如果两者都给出,则优先
。(在MySQL 5.5和5.6中,这是相反的:
如果两者都给出--log-error,--console则优先。
| 属性 | 值 |
|---|---|
| 命令行格式 | --core-file |
| 类型 | 布尔 |
| 默认 | OFF |
如果mysqld死了,写一个核心文件。核心文件的名称和位置取决于系统。在Linux上,一个名为core的文件
被写入进程的当前工作目录,mysqld是数据目录。
代表服务器进程的进程ID。在OS X上,名为的核心文件
被写入目录。在Solaris上,使用coreadm命令指定写入核心文件的位置以及如何命名该文件。
core.pidpidcore.pid/cores
对于某些系统,要获取核心文件,还必须指定
mysqld_safe--core-file-size选项
。请参见
第4.3.2节“ mysqld_safe - MySQL服务器启动脚本”。在某些系统上,如Solaris,如果您也在使用该选项,则不会获得核心文件
。可能有其他限制或限制。例如,
在启动服务器之前可能需要执行ulimit -c unlimited。请咨询您的系统文档。
--user
| 属性 | 值 |
|---|---|
| 命令行格式 | --daemonize[={OFF|ON}] |
| 介绍 | 5.7.6 |
| 类型 | 布尔 |
| 默认 | OFF |
此选项使服务器作为传统的分叉守护程序运行,允许它与使用systemd进行过程控制的操作系统一起使用。有关更多信息,请参见 第2.5.10节“使用systemd管理MySQL服务器”。
--daemonize是相互排斥的--bootstrap,
--initialize和
--initialize-insecure。
--datadir=,
dir_name-h
dir_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --datadir=dir_name |
| 系统变量 | datadir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
MySQL服务器数据目录的路径。该选项设置datadir系统变量。请参阅该变量的说明。
--debug[=,
debug_options]-# [
debug_options]
| 属性 | 值 |
|---|---|
| 命令行格式 | --debug[=debug_options] |
| 系统变量 | debug |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(Windows) | 串 |
| 类型(Unix) | 串 |
| 默认(Windows) | d:t:i:O,\mysqld.trace |
| 默认(Unix) | d:t:i:o,/tmp/mysqld.trace |
如果MySQL配置了
CMake选项,则可以使用此选项获取mysqld正在执行的跟踪文件。一个典型的字符串是
。默认是在Unix和Windows上。
-DWITH_DEBUG=1
debug_optionsd:t:o,file_named:t:i:o,/tmp/mysqld.traced:t:i:O,\mysqld.trace
使用-DWITH_DEBUG=1通过调试支持来配置MySQL使您--debug="d,parser_debug"可以在启动服务器时使用该
选项。这会导致用于处理SQL语句的Bison解析器将解析器跟踪转储到服务器的标准错误输出。通常,该输出写入错误日志。
该选项可能会多次提供。以先前的值开头+或-添加或从之前的值中减去的值。例如,
将值设置为
。
--debug=T
--debug=+PP:T
有关更多信息,请参见第28.5.3节“DBUG包”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --debug-sync-timeout[=#] |
| 类型 | 整数 |
控制是否启用了用于测试和调试的调试同步工具。使用Debug Sync要求使用CMake选项配置MySQL
(请参见
第2.9.4节“MySQL源配置选项”)。如果调试同步未被编译,则此选项不可用。选项值是以秒为单位的超时值。默认值为0,禁用调试同步。要启用它,请指定一个大于0的值; 此值也会成为各个同步点的默认超时值。如果给出的选项没有值,则超时设置为300秒。
-DENABLE_DEBUG_SYNC=1
有关调试同步工具以及如何使用同步点的说明,请参阅 MySQL内部:测试同步。
--default-authentication-plugin=
plugin_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --default-authentication-plugin=plugin_name |
| 删除 | 5.7.2 |
| 类型 | 列举 |
| 默认 | mysql_native_password |
| 有效值 |
|
该选项设置默认身份验证插件。它在MySQL 5.7.2中被删除,并被default_authentication_plugin
系统变量取代
。该变量的使用方式与服务器启动时的选项相同,但也可以将缺省插件值视为运行时检查。有关使用详情,请参阅说明
default_authentication_plugin。
| 属性 | 值 |
|---|---|
| 命令行格式 | --default-storage-engine=name |
| 系统变量 | default_storage_engine |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | InnoDB |
设置表格的默认存储引擎。请参阅
第15章,备用存储引擎。该选项仅设置永久表的存储引擎。要设置TEMPORARY表格的存储引擎,请设置
default_tmp_storage_engine
系统变量。
如果在服务器启动时禁用默认存储引擎,则必须将永久和TEMPORARY表的默认引擎设置为
不同的引擎,否则服务器将无法启动。
| 属性 | 值 |
|---|---|
| 命令行格式 | --default-time-zone=name |
| 类型 | 串 |
设置默认服务器时区。该选项设置全局
time_zone系统变量。如果未给出此选项,则默认时区与系统时区相同(由system_time_zone系统变量的值给出)
。
--defaults-extra-file=
file_name
在全局选项文件之后读取此选项文件,但在用户选项文件之前(在Unix上)。如果文件不存在或无法访问,则会发生错误。
file_name如果作为相对路径名而非完整路径名给出,则相对于当前目录进行解释。如果使用它,它必须是命令行中的第一个选项。
有关此选项的其他信息,请参见 第4.2.7节“影响选项文件处理的命令行选项”。
只读取给定的选项文件。如果文件不存在或无法访问,则会发生错误。
file_name如果作为相对路径名而非完整路径名给出,则相对于当前目录进行解释。
这必须是在命令行中的第一个选项,如果它被使用,只是如果服务器开始使用
--defaults-file和
--install(或
--install-manual)选项,
--install(或
--install-manual)必须是第一个。
有关此选项的其他信息,请参见 第4.2.7节“影响选项文件处理的命令行选项”。
不仅要阅读常用选项组,还要阅读具有常用名称和后缀的组
str。例如,
mysqld通常读取该
[mysqld]组。如果--defaults-group-suffix=_other
给出该
选项,mysqld也会读取该
[mysqld_other]组。
有关此选项的其他信息,请参见 第4.2.7节“影响选项文件处理的命令行选项”。
--delay-key-write[={OFF|ON|ALL}]
| 属性 | 值 |
|---|---|
| 命令行格式 | --delay-key-write[=name] |
| 系统变量 | delay_key_write |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | ON |
| 有效值 |
|
指定如何使用延迟键写入。延迟键写入会导致键缓冲区在MyISAM表写入之间不会被刷新
。OFF
禁用延迟键写入。ON为使用该DELAY_KEY_WRITE选项创建的表启用延迟键写入
。
ALL延迟所有MyISAM表的关键写入
。请参见
第5.1.1节“配置服务器”和
第15.2.1节“MyISAM启动选项”。
如果将此变量设置为ALL,则在使用MyISAM表时,不应使用其他程序内的表(例如另一个MySQL服务器或
myisamchk)。这样做会导致索引损坏。
| 属性 | 值 |
|---|---|
| 命令行格式 | --des-key-file=file_name |
| 弃用 | 5.7.6 |
从该文件读取默认的DES密钥。这些键用于DES_ENCRYPT()和
DES_DECRYPT()功能。
这些DES_ENCRYPT()和
DES_DECRYPT()函数从MySQL 5.7.6开始不推荐使用,将在未来的MySQL版本中被删除,不应该再使用。因此,
--des-key-file也被弃用并将被删除。
--disable-partition-engine-check
| 属性 | 值 |
|---|---|
| 命令行格式 | --disable-partition-engine-check |
| 介绍 | 5.7.17 |
| 弃用 | 5.7.17 |
| 类型(> = 5.7.17) | 布尔 |
| 默认(> = 5.7.21) | true |
| 默认(> = 5.7.17,<= 5.7.20) | false |
是否禁用启动检查具有非本地分区的表。
从MySQL 5.7.17开始,MySQL服务器中的通用分区处理程序已被弃用,并且在用于给定表的存储引擎需要提供其自己的(“ 本地 ”)分区处理程序时,将在MySQL 8.0中删除。目前,只有
InnoDB和
NDB存储引擎做到这一点。
使用带有非本地分区的表格会导致
ER_WARN_DEPRECATED_SYNTAX
警告。在MySQL 5.7.17到5.1.20中,服务器在启动时自动执行检查以识别使用非本地分区的表; 对于找到的任何内容,服务器会将消息写入其错误日志。要禁用此检查,请使用该
--disable-partition-engine-check
选项。在MySQL 5.7.21及更高版本中,不执行此检查
; 在这些版本中,--disable-partition-engine-check=false如果希望服务器使用通用分区处理程序检查表(错误#85830,错误#25846957),则必须启动服务器
。
对非本地分区使用表会导致
ER_WARN_DEPRECATED_SYNTAX
警告。此外,服务器在启动时执行检查以识别使用非本地分区的表; 对于任何找到的,服务器都将消息写入其错误日志。要禁用此检查,请使用该
--disable-partition-engine-check
选项。
为了准备迁移到MySQL 8.0,任何具有非本地分区的表都应该改为使用提供本地分区的引擎,或者将其设置为非分区。例如,要将表更改为InnoDB,请执行以下语句:
ALTER TABLE table_nameENGINE = INNODB;
--early-plugin-load=
plugin_list
| 属性 | 值 |
|---|---|
| 命令行格式 | --early-plugin-load=plugin_list |
| 介绍 | 5.7.11 |
| 类型(> = 5.7.11) | 串 |
| 默认(> = 5.7.12) | empty string |
| 默认(5.7.11) | keyring_file plugin library file name |
此选项告诉服务器在加载强制内置插件之前和存储引擎初始化之前加载哪些插件。如果--early-plugin-load给出多个
选项,则只使用最后一个。
选项值是以分号分隔的列表
和值。每个
都是要加载的插件的名称,并且是包含插件代码的库文件的名称。如果插件库的名称没有任何前面的插件名称,则服务器会加载库中的所有插件。服务器在由系统变量命名的目录中查找插件库文件
。
name=plugin_libraryplugin_librarynameplugin_libraryplugin_dir
例如,如果插件命名myplug1并
myplug2有库文件,
myplug1.so并
myplug2.so使用此选项来执行早期插件加载:
外壳> mysqld --early-plugin-load="myplug1=myplug1.so;myplug2=myplug2.so"
引号用于参数值,否则分号(;)会被某些命令解释器解释为特殊字符。(例如,Unix shell将它视为命令终止符。)
每个指定的插件都会提前加载,只能调用一次
mysqld。重新启动后,插件不会提前加载,除非
--early-plugin-load再次使用。
如果服务器开始使用
--initialize或
--initialize-insecure,则指定的插件
--early-plugin-load未加载。
如果服务器运行
--help,则由指定的插件
--early-plugin-load加载但未初始化。此行为可确保插件选项显示在帮助消息中。
从MySQL 5.7.12开始,默认
--early-plugin-load值为空。要加载你选择的密钥环插件,你必须使用--early-plugin-load
一个非空值的显式选项。
在MySQL 5.7.11中,默认
--early-plugin-load值是keyring_file插件库文件的名称,所以该插件默认加载。
InnoDB表空间加密需要在
初始化keyring_file之前加载插件
InnoDB,因此这种默认--early-plugin-load
值的更改会导致从5.7.11升级到5.7.12或更高版本时的不兼容性。已加密InnoDB表空间的管理员
必须采取明确措施确保持续加载
keyring_file插件:使用--early-plugin-load
命名插件库文件的选项启动服务器。有关其他信息,请参阅第6.5.4.1节“安装Keyring插件”。
该InnoDB表空间加密功能依赖于keyring_file插件加密密钥管理和
keyring_file插件之前必须存储引擎初始化加载,以便
InnoDB为加密表恢复。在MySQL 5.7.11中,如果您不想keyring_file在服务器启动时加载
插件,请指定一个空字符串(--early-plugin-load="")。
有关InnoDB表空间加密的信息,请参见
第14.7.10节“InnoDB表空间加密”。有关插件加载的一般信息,请参见
第5.5.1节“安装和卸载插件”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --enable-named-pipe |
| 平台特定 | 视窗 |
启用对命名管道的支持。该选项仅适用于Windows。
| 属性 | 值 |
|---|---|
| 命令行格式 | --event-scheduler[=value] |
| 系统变量 | event_scheduler |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | OFF |
| 有效值 |
|
启用或禁用,并启动或停止事件调度程序。
有关详细信息,请参阅
该
--event-scheduler选项。
--exit-info[=,
flags]-T [
flags]
| 属性 | 值 |
|---|---|
| 命令行格式 | --exit-info[=flags] |
| 类型 | 整数 |
这是一个可以用来调试mysqld服务器的不同标志位掩码。除非你确切地知道它做了什么,否则不要使用这个选项!
| 属性 | 值 |
|---|---|
| 命令行格式 | --external-locking |
| 类型 | 布尔 |
| 默认 | FALSE |
启用外部锁定(系统锁定),默认情况下禁用。如果你在一个lockd没有完全工作的系统上(例如Linux)使用这个选项
,mysqld很容易死锁。
要显式禁用外部锁定,请使用
--skip-external-locking。
外部锁仅影响
MyISAM表访问。有关更多信息,包括可以使用和不可使用的条件,请参见第8.11.5节“外部锁定”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --flush |
| 系统变量 | flush |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
在每个SQL语句之后刷新(同步)对磁盘的所有更改。通常情况下,只有在每个SQL语句之后,MySQL才会写入对磁盘的所有更改,并让操作系统处理与磁盘的同步。参见 第B.5.3.3节“如果MySQL保持崩溃怎么办”。
如果--flush指定,则值flush_time无关紧要,并且更改为
flush_time对刷新行为没有影响。
| 属性 | 值 |
|---|---|
| 命令行格式 | --gdb |
| 类型 | 布尔 |
| 默认 | FALSE |
安装中断处理程序SIGINT
(停止所需的mysqld与
^C设置断点),并且禁止堆栈跟踪和核心文件处理。请参见第28.5节“调试和移植MySQL”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --general-log |
| 系统变量 | general_log |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
指定初始的一般查询日志状态。如果没有参数或参数为1,则该
--general-log选项将启用日志。如果省略或用0的参数给出,则该选项将禁用日志。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ignore-db-dir |
| 弃用 | 16年7月5日 |
| 类型 | 目录名称 |
这个选项告诉服务器为了一个SHOW
DATABASES或多个
INFORMATION_SCHEMA表格的目的而忽略给定的目录名称。例如,如果MySQL配置将数据目录定位在Unix上文件系统的根目录下,那么系统可能会lost+found在服务器应该忽略的地方创建一个
目录。使用--ignore-db-dir=lost+found
名称不会列为数据库的原因启动服务器
。
要指定多个名称,请多次使用此选项,每个名称使用一次。指定具有空值的选项(即as --ignore-db-dir=)会将目录列表重置为空列表。
服务器启动时给出的这个选项的实例用于设置ignore_db_dirs系统变量。
这个选项在MySQL 5.7中不推荐使用。随着MySQL 8.0中的数据字典的引入,它变得多余,并在该版本中被删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --initialize |
| 介绍 | 5.7.6 |
| 类型 | 布尔 |
| 默认 | OFF |
此选项用于通过创建数据目录并填充mysql系统数据库中的表来初始化MySQL安装
。有关更多信息,请参见
第2.10.1.1节“使用mysqld手动初始化数据目录”。
当服务器启动时
--initialize,某些功能不可用,从而限制了该--init-file选项指定的任何文件中允许的语句
。有关更多信息,请参阅该选项的说明。另外,
disabled_storage_engines
系统变量不起作用。
在MySQL NDB Cluster 7.5.4和更高版本中,与该--ndbcluster选项一起使用时,该
选项将被忽略--initialize。(错误#81689,错误#23518923)
在MySQL 5.7.7及更早版本中,全局事务标识符(GTID)--initialize在启用时自动禁用
。在MySQL 5.7.8和更高版本中,GTID在--initialize启用时不会被禁用
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --initialize-insecure |
| 介绍 | 5.7.6 |
| 类型 | 布尔 |
| 默认 | OFF |
此选项用于通过创建数据目录并填充mysql系统数据库中的表来初始化MySQL安装
。这个选项意味着
--initialize。有关更多信息,请参阅该选项的说明以及
第2.10.1.1节“使用mysqld手动初始化数据目录”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --init-file=file_name |
| 系统变量 | init_file |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
在启动时从这个文件读取SQL语句。每条声明必须在一行中,不应包含注释。
如果服务器开始任何的
--bootstrap,
--initialize或
--initialize-insecure期权,它工作在bootstap模式和某些功能不可用时限制了文件中允许使用的语句。这些包括与帐户管理(例如CREATE USER或
GRANT),复制和全局事务标识符相关的语句。请参见
第16.1.3节“使用全局事务标识符进行复制”。
--innodb-
xxx
为InnoDB存储引擎设置一个选项。这些InnoDB选项在第14.14节“InnoDB启动选项和系统变量”中列出
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --install [service_name] |
| 平台特定 | 视窗 |
(仅限Windows)将服务器安装为在Windows启动期间自动启动的Windows服务。默认的服务名称是MySQL如果没有
service_name给出值。有关更多信息,请参见第2.3.5.8节“将MySQL作为Windows服务启动”。
如果服务器使用--defaults-file和
--install选项
启动,则
--install必须先启动。
--install-manual
[
service_name]
| 属性 | 值 |
|---|---|
| 命令行格式 | --install-manual [service_name] |
| 平台特定 | 视窗 |
(仅限Windows)将服务器安装为必须手动启动的Windows服务。它不会在Windows启动过程中自动启动。默认的服务名称是
MySQL如果没有
service_name给出值。有关更多信息,请参见第2.3.5.8节“将MySQL作为Windows服务启动”。
如果服务器使用--defaults-file和
--install-manual选项
启动,则
--install-manual必须先启动。
--language=
lang_name,
-L lang_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --language=name |
| 弃用 | 是; 使用lc-messages-dir |
| 系统变量 | language |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
| 默认 | /usr/local/mysql/share/mysql/english/ |
用于错误消息的语言。
lang_name可以作为语言名称或作为安装语言文件的目录的完整路径名给出。请参见
第10.11节“设置错误消息语言”。
--lc-messages-dir并且
--lc-messages应该被使用,而不是--language被弃用(并且作为别名被处理
--lc-messages-dir)。该
--language选项将在未来的MySQL版本中被删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --large-pages |
| 系统变量 | large_pages |
| 范围 | 全球 |
| 动态 | 没有 |
| 平台特定 | Linux的 |
| 类型(Linux) | 布尔 |
| 默认(Linux) | FALSE |
某些硬件/操作系统体系结构支持的内存页面大于默认值(通常为4KB)。这种支持的实际实施取决于底层硬件和操作系统。执行大量内存访问的应用程序可能通过使用大页面来获得性能改进,这是因为减少了翻译旁视缓冲区(TLB)缺失。
MySQL支持大型页面支持的Linux实现(在Linux中称为HugeTLB)。请参见
第8.12.4.2节“启用大页面支持”。有关Solaris支持大页面的信息,请参阅该--super-large-pages选项的说明
。
--large-pages 在默认情况下被禁用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --lc-messages=name |
| 系统变量 | lc_messages |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | en_US |
用于错误消息的语言环境。默认是
en_US。服务器将参数转换为语言名称,并将其与值组合
--lc-messages-dir以生成错误消息文件的位置。请参见
第10.11节“设置错误消息语言”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --lc-messages-dir=dir_name |
| 系统变量 | lc_messages_dir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
错误消息所在的目录。服务器使用该值和值
--lc-messages来生成错误消息文件的位置。请参见
第10.11节“设置错误消息语言”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --local-service |
(仅限Windows)--local-service服务名称后面的选项会导致服务器使用LocalService具有有限系统特权的Windows帐户运行
。如果两个
--defaults-file和
--local-service给出以下服务名称,他们可以在任何顺序。请参见
第2.3.5.8节“将MySQL作为Windows服务启动”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-error[=file_name] |
| 系统变量 | log_error |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
将错误日志和启动消息写入此文件。请参见 第5.4.2节“错误日志”。
如果该选项不命名文件,则Unix和类Unix系统上的错误日志文件名称
位于数据目录中。除非host_name.err--pid-file指定了选项,否则Windows上的文件名相同。在这种情况下,文件名是PID文件基本名称,后缀为.err数据目录中的后缀。
如果该选项命名文件,则.err除非给出指定其他位置的绝对路径名,否则错误日志文件具有该名称(如果名称没有后缀,则添加了后缀)。
在Windows中,如果两者都给出,--console则优先--log-error。在这种情况下,服务器将错误日志写入控制台而不是文件。(在MySQL 5.5和5.6中,这是相反的:
如果两者都给出--log-error
,--console则优先。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-isam[=file_name] |
| 类型 | 文件名 |
记录MyISAM对此文件的所有更改(仅在调试时使用MyISAM)。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-output=name |
| 系统变量 | log_output |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 组 |
| 默认 | FILE |
| 有效值 |
|
此选项确定一般查询日志和慢速查询日志输出的目的地。选项值可作为一个或一个以上的话TABLE,
FILE或NONE。
TABLE选择将日志记录
general_log和
数据库中的slow_log表
mysql作为目标。
FILE选择日志记录以将文件记录为目标。NONE禁用日志记录。如果
NONE出现在选项值中,则优先于任何其他存在的单词。
TABLE并且FILE可以同时选择两个日志输出目标。
该选项选择日志输出目标,但不启用日志输出。要做到这一点,请使用
--general_log和
--slow_query_log选项。对于
FILE日志记录,
--general_log_file和
-slow_query_log_file选项确定日志文件的位置。有关更多信息,请参见
第5.4.1节“选择常规查询和慢速查询日志输出目标”。
--log-queries-not-using-indexes
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-queries-not-using-indexes |
| 系统变量 | log_queries_not_using_indexes |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
如果在启用了慢速查询日志的情况下使用此选项,则会记录预期检索所有行的查询。请参见 第5.4.5节“慢速查询日志”。该选项不一定表示不使用索引。例如,使用完整索引扫描的查询使用索引,但会被记录,因为索引不会限制行数。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-raw[=value] |
| 类型 | 布尔 |
| 默认 | OFF |
在写入一般查询日志,慢速查询日志和二进制日志的某些语句中,密码被服务器重写,不会以纯文本形式出现。通过使用该--log-raw选项启动服务器,可以为通用查询日志禁用密码重写
。此选项对于诊断目的可能很有用,可以查看服务器收到的语句的确切文本,但出于安全原因不建议将其用于生产用途。
如果安装了查询重写插件,则该
--log-raw选项会影响语句记录,如下所示:
有关更多信息,请参见第6.1.2.3节“密码和日志记录”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-short-format |
| 类型 | 布尔 |
| 默认 | FALSE |
将较少的信息记录到慢查询日志中(如果它已被激活)。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-slow-admin-statements (5.7.0) |
| 删除 | 5.7.1 |
| 类型 | 布尔 |
| 默认 | OFF |
在写入慢查询日志的语句中包含慢管理语句。行政陈述包括ALTER TABLE,
ANALYZE TABLE,
CHECK TABLE,
CREATE INDEX,
DROP INDEX,
OPTIMIZE TABLE,和
REPAIR TABLE。
这个命令行选项在MySQL 5.7.1中被删除,并被log_slow_admin_statements
系统变量取代
。系统变量可以在命令行或选项文件中以与选项相同的方式进行设置,因此在服务器启动时不需要进行任何更改,但系统变量也可以在运行时检查或设置值。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-tc=file_name |
| 类型 | 文件名 |
| 默认 | tc.log |
内存映射事务协调器日志文件的名称(对于禁用二进制日志时影响多个存储引擎的XA事务)。默认名称是
tc.log。如果未以完整路径名称的形式给出该文件,则该文件将在数据目录下创建。此选项未使用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-tc-size=# |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台,> = 5.7.21) | 6 * page size |
| 默认(64位平台,<= 5.7.20) | 24576 |
| 默认(32位平台,> = 5.7.21) | 6 * page size |
| 默认(32位平台,<= 5.7.20) | 24576 |
| 最小(64位平台,> = 5.7.21) | 6 * page size |
| 最小(32位平台,> = 5.7.21) | 6 * page size |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
内存映射事务协调器日志的大小(以字节为单位)。默认值和最小值是页面大小的6倍,并且该值必须是页面大小的倍数。(在MySQL 5.7.21之前,默认大小为24KB。)
--log-warnings[=,
level]-W [
level]
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-warnings[=#] |
| 弃用 | 5.7.2 |
| 系统变量 | log_warnings |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台,> = 5.7.2) | 2 |
| 默认(64位平台,<= 5.7.1) | 1 |
| 默认(32位平台,> = 5.7.2) | 2 |
| 默认(32位平台,<= 5.7.1) | 1 |
| 最低(64位平台) | 0 |
| 最低(32位平台) | 0 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
从MySQL 5.7.2开始,
log_error_verbosity系统变量首选,而不是--log-warnings选项或
log_warnings系统变量。欲了解更多信息,请参阅的说明
log_error_verbosity和
log_warnings。该
--log-warnings命令行选项和log_warnings
系统变量被取消,并将在未来的MySQL版本中删除。
是否向错误日志生成额外的警告消息。这个选项是默认启用的(MySQL 5.7.2之前默认为1,5.7.2之后为2)。要禁用它,请使用
--log-warnings=0。指定没有level值的选项会将当前值递增1.如果值大于0,则服务器记录有关对基于语句的日志记录不安全的语句的消息。如果发生新连接尝试,则会记录中止连接和拒绝访问的错误值大于1.请参见
第B.5.2.10节“通信错误和中止的连接”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --low-priority-updates |
| 系统变量 | low_priority_updates |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | FALSE |
得到表修改操作(INSERT,
REPLACE,
DELETE,
UPDATE),比选择较低优先级。这也可以{INSERT |
REPLACE | DELETE | UPDATE} LOW_PRIORITY ...用来降低只有一个查询的优先级,或者通过SET
LOW_PRIORITY_UPDATES=1改变一个线程的优先级来完成。这会影响只使用表级锁(仅存储引擎MyISAM,
MEMORY,MERGE)。请参见
第8.11.2节“表锁定问题”。
--min-examined-row-limit=
number
| 属性 | 值 |
|---|---|
| 命令行格式 | --min-examined-row-limit=# |
| 系统变量 | min_examined_row_limit |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 0 |
| 默认(32位平台) | 0 |
| 最低(64位平台) | 0 |
| 最低(32位平台) | 0 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
设置此选项时,检查少于
number行的查询不写入慢速查询日志。默认值是0。
| 属性 | 值 |
|---|---|
| 命令行格式 | --memlock |
| 类型 | 布尔 |
| 默认 | FALSE |
将mysqld进程锁定在内存中。如果您在操作系统导致mysqld交换到磁盘时遇到问题,此选项可能会有所帮助。
--memlock适用于支持mlockall()系统调用的系统; 这包括Solaris,大多数使用2.4或更高版本内核的Linux发行版以及其他Unix系统。在Linux系统上,您可以
mlockall()通过检查系统mman.h文件中是否定义它来判断是否支持(以及此选项),如下所示:
外壳> grep mlockall /usr/include/sys/mman.h
如果mlockall()被支持,你应该在前面的命令的输出中看到如下内容:
extern int mlockall(int __flags)__THROW;
使用此选项可能需要您运行服务器
root,因为出于安全原因,通常不是一个好主意。请参见
第6.1.5节“如何以普通用户身份运行MySQL”。
在Linux和其他系统上,您可以避免root通过更改
limits.conf文件来运行服务器。请参阅第8.12.4.2节“启用大页面支持”中关于memlock限制的说明
。
您不能尝试在不支持mlockall()系统调用的系统上使用此选项; 如果你这样做的话,一旦你尝试启动它,mysqld很可能会崩溃。
| 属性 | 值 |
|---|---|
| 命令行格式 | --myisam-block-size=# |
| 类型 | 整数 |
| 默认 | 1024 |
| 最低限度 | 1024 |
| 最大 | 16384 |
要用于MyISAM索引页面的块大小。
--myisam-recover-options[=
option[,option]...]]
| 属性 | 值 |
|---|---|
| 命令行格式 | --myisam-recover-options[=name] |
| 类型 | 列举 |
| 默认 | OFF |
| 有效值 |
|
设置MyISAM存储引擎恢复模式。该选项值的值的任意组合
OFF,DEFAULT,
BACKUP,FORCE,或
QUICK。如果您指定多个值,请用逗号分隔它们。指定没有参数的选项与指定相同DEFAULT,并指定""
禁用恢复的显式值(与值相同OFF)。如果恢复已启用,则每次mysqld
打开一个MyISAM表,它检查表是否标记为崩溃或未正确关闭。(最后一个选项仅在禁用外部锁定的情况下运行。)如果是这种情况,
mysqld在表上运行检查。如果表被破坏,mysqld会尝试修复它。
以下选项会影响修复的工作方式。
| 选项 | 描述 |
|---|---|
OFF |
没有恢复。 |
DEFAULT |
没有备份的恢复,强制或快速检查。 |
BACKUP |
如果数据文件在恢复期间发生更改,请将该
文件的备份保存
为
。 |
FORCE |
即使我们会丢失.MYD文件中的多行,也要运行恢复
。 |
QUICK |
如果没有任何删除块,请不要检查表中的行。 |
在服务器自动修复表之前,它会将关于修复的注释写入错误日志。如果您希望能够在没有用户干预的情况下从大多数问题中恢复,则应该使用这些选项BACKUP,FORCE。这会强制修复表,即使某些行将被删除,但它会将旧数据文件保留为备份,以便您可以稍后检查发生的情况。
不要阅读任何选项文件。如果由于从选项文件读取未知选项而导致程序启动失败,
--no-defaults可用于防止读取它们。如果使用它,它必须是命令行中的第一个选项。
有关此选项的其他信息,请参见 第4.2.7节“影响选项文件处理的命令行选项”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --old-alter-table |
| 系统变量 | old_alter_table |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
当给出该选项时,服务器不使用处理ALTER
TABLE操作的优化方法。它恢复为使用临时表,复制数据,然后将临时表重新命名为原始表,正如MySQL 5.0及更早版本所使用的那样。有关操作的更多信息
ALTER TABLE,请参见
第13.1.8节“ALTER TABLE语法”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --old-style-user-limits |
| 类型 | 布尔 |
| 默认 | FALSE |
启用旧式用户限制。(在MySQL 5.0.3之前,帐户资源限制是针对连接用户的每个主机而不是user表中的每个帐户行单独计算的
。)请参见
第6.3.5节“设置帐户资源限制”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --open-files-limit=# |
| 系统变量 | open_files_limit |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 5000, with possible adjustment |
| 最低限度 | 0 |
| 最大 | platform dependent |
Changes the number of file descriptors available to
mysqld. You should try increasing the value
of this option if mysqld gives you the
error Too many open files.
mysqld uses the option value to reserve
descriptors with setrlimit(). Internally,
the maximum value for this option is the maximum unsigned
integer value, but the actual maximum is platform dependent.
If the requested number of file descriptors cannot be
allocated, mysqld writes a warning to the
error log.
mysqld的可能试图比描述符的请求数量的分配更多的(如果它们可用),使用的值
max_connections和
table_open_cache估计是否将需要更多的描述符。
在Unix上,该值不能大于ulimit -n。
| 属性 | 值 |
|---|---|
| 命令行格式 | --partition |
| 弃用 | 16年7月5日 |
| 被禁用 | skip-partition |
| 类型 | 布尔 |
| 默认 | ON |
在MySQL服务器中启用或禁用用户定义的分区支持。
此选项在MySQL 5.7.16中不推荐使用,并从MySQL 8.0中删除,因为在MySQL 8.0中,分区引擎被本地分区取代,而分区引擎无法禁用。
--performance-schema-xxx
配置性能架构选项。有关详细信息,请参见 第25.13节“性能架构命令选项”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --pid-file=file_name |
| 系统变量 | pid_file |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
进程ID文件的路径名称。服务器在数据目录中创建文件,除非给出绝对路径名来指定不同的目录。如果您指定此选项,则必须指定一个值。如果您不指定此选项,则MySQL使用默认值
,其中host_name.pidhost_name是主机名称。
其他程序(如mysqld_safe)使用进程ID文件 来确定服务器的进程ID。在Windows上,该变量也会影响默认的错误日志文件名称。请参见第5.4.2节“错误日志”。
指定与服务器插件有关的选项。例如,许多存储引擎可以构建为插件,并且对于这样的引擎,它们的选项可以用--plugin前缀来指定
。因此,
--innodb_file_per_table选项InnoDB可以被指定为
--plugin-innodb_file_per_table。
对于可以启用或禁用的布尔选项,也支持
--skip前缀和其他格式(请参见
第4.2.5节“程序选项修饰符”)。例如,
--skip-plugin-innodb_file_per_table
禁用innodb_file_per_table。
--plugin前缀
的基本原理是,如果与内置服务器选项存在名称冲突,则可以明确指定插件选项。例如,插件编写者为插件“ sql ”命名
并实现“ 模式 ”选项,选项名称可能
--sql-mode会与相同名称的内置选项冲突。在这种情况下,对冲突名称的引用将被解析为有利于内置选项。为避免含糊不清,用户可以将插件选项指定为
--plugin-sql-mode。使用
--plugin 推荐使用插件选项的前缀以避免任何含糊不清的问题。
| 属性 | 值 |
|---|---|
| 命令行格式 | --plugin-load=plugin_list |
| 类型 | 串 |
该选项告诉服务器在启动时加载指定的插件。如果--plugin-load给出多个
选项,则只使用最后一个。可以使用--plugin-load-add选项指定要加载的其他插件
。
选项值是以分号分隔的列表
和值。每个
都是要加载的插件的名称,并且是包含插件代码的库文件的名称。如果插件库的名称没有任何前面的插件名称,则服务器会加载库中的所有插件。服务器在由系统变量命名的目录中查找插件库文件
。
name=plugin_libraryplugin_librarynameplugin_libraryplugin_dir
例如,如果插件命名myplug1并
myplug2有库文件,
myplug1.so并
myplug2.so使用此选项来执行早期插件加载:
外壳> mysqld --plugin-load="myplug1=myplug1.so;myplug2=myplug2.so"
引号在这里用于参数值,因为否则semicolon(;)被某些命令解释器解释为特殊字符。(例如,Unix shell将它视为命令终止符。)
每个已命名的插件仅用于单个mysqld调用
。重新启动后,插件不会被加载,除非--plugin-load
再次使用。这与之相反
INSTALL PLUGIN,它在mysql.plugins表中添加一个条目,以便为每个普通服务器启动加载插件。
在正常启动时,服务器通过读取mysql.plugins系统表来确定要加载的插件。如果服务器使用该--skip-grant-tables选项启动
,它不会查阅mysql.plugins表格,也不会加载列表中的插件。
--plugin-load即使--skip-grant-tables给出插件也可以加载
。
--plugin-load还可以使插件在启动时加载,而不能在运行时加载。
有关插件加载的更多信息,请参见 第5.5.1节“安装和卸载插件”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --plugin-load-add=plugin_list |
| 类型 | 串 |
该选项补充了该
--plugin-load选项。
--plugin-load-add将一个插件或插件添加到启动时要加载的一组插件中。参数格式与for相同
--plugin-load。
--plugin-load-add可以用来避免指定一大组插件作为一个冗长笨拙的--plugin-load
参数。
--plugin-load-add可以在没有的情况下给出
--plugin-load,但是--plugin-load-add之前出现的任何情况--plugin-load。没有效果,因为
--plugin-load重置要加载的插件集。换句话说,这些选项:
--plugin-load = x --plugin-load-add = y
相当于这个选项:
--plugin负载= “X; Y”
但是这些选项:
--plugin-load-add = y --plugin-load = x
相当于这个选项:
--plugin负荷= X
有关插件加载的更多信息,请参见 第5.5.1节“安装和卸载插件”。
--port=,
port_num-P
port_num
| 属性 | 值 |
|---|---|
| 命令行格式 | --port=# |
| 系统变量 | port |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 3306 |
| 最低限度 | 0 |
| 最大 | 65535 |
侦听TCP / IP连接时使用的端口号。在Unix和类Unix系统上,除非服务器由root系统用户启动,否则端口号必须为1024或更高
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --port-open-timeout=# |
| 类型 | 整数 |
| 默认 | 0 |
在某些系统上,当服务器停止时,TCP / IP端口可能不会立即变为可用。如果之后服务器很快重新启动,则尝试重新打开端口可能会失败。此选项指示服务器在无法打开时等待TCP / IP端口变为空闲的秒数。默认不等待。
打印程序名称以及从选项文件中获取的所有选项。密码值被屏蔽。这必须是在命令行上的第一个选项,如果使用它,除了它可能立即后使用
--defaults-file或
--defaults-extra-file。
有关此选项的其他信息,请参见 第4.2.7节“影响选项文件处理的命令行选项”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --remove [service_name] |
| 平台特定 | 视窗 |
(仅限Windows)删除MySQL Windows服务。默认的服务名称是MySQL如果没有
service_name给出值。有关更多信息,请参见第2.3.5.8节“将MySQL作为Windows服务启动”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --safe-user-create |
| 类型 | 布尔 |
| 默认 | FALSE |
如果启用此选项,则用户不能通过使用该GRANT
语句来创建新的MySQL用户,除非该用户具有INSERT该mysql.user表或表中任何列的
特权
。如果您希望用户有能力创建具有用户有权授予的权限的新用户,则应授予该用户以下特权:
GRANT INSERT(user)ON mysql.user TO'user_name'@'host_name';
这确保用户不能直接更改任何权限列,但必须使用该
GRANT语句向其他用户授予权限。
| 属性 | 值 |
|---|---|
| 命令行格式 | --secure-auth |
| 弃用 | 5.7.5 |
| 系统变量 | secure_auth |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | ON |
| 有效值(> = 5.7.5) | ON |
| 有效值(<= 5.7.4) |
|
此选项会导致服务器阻止尝试使用以旧(4.1之前)格式存储密码的帐户的客户端建立连接。用它来防止所有使用旧格式的密码(并因此通过网络进行不安全的通信)。
从MySQL 5.7.5开始,此选项已被弃用,并将在未来的MySQL版本中删除。它始终处于启用状态,并尝试禁用它(--skip-secure-auth,
--secure-auth=0)会产生错误。在MySQL 5.7.5之前,该选项默认启用,但可以禁用。
如果启用此选项并且特权表格为4.1之前的格式,则服务器启动将失败,并显示错误。请参见 第6.5.1.3节“从4.1之前的密码散列和mysql_old_password插件迁移”。
在MySQL的客户端也有一个
--secure-auth选项,如果服务器需要在老格式的客户帐户密码,以防止到服务器的连接。
使用4.1以前的哈希方法的密码比使用本机密码散列方法并应避免的密码的安全性要低。4.1以前的密码已被弃用,并且在MySQL 5.7.5中对其进行了支持。有关帐户升级说明,请参见 第6.5.1.3节“从4.1之前的密码散列和mysql_old_password插件迁移”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --secure-file-priv=dir_name |
| 系统变量 | secure_file_priv |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
| 默认(> = 5.7.6) | platform specific |
| 默认(<= 5.7.5) | empty string |
| 有效值(> = 5.7.6) |
|
| 有效值(<= 5.7.5) |
|
该选项设置
secure_file_priv系统变量,该变量用于限制数据导入和导出操作的效果,例如由LOAD DATAand和
SELECT ... INTO
OUTFILE语句和
LOAD_FILE()函数执行的操作
。有关更多信息,请参阅说明
secure_file_priv。
| 属性 | 值 |
|---|---|
| 命令行格式 | --shared-memory[={0,1}] |
| 系统变量 | shared_memory |
| 范围 | 全球 |
| 动态 | 没有 |
| 平台特定 | 视窗 |
| 类型 | 布尔 |
| 默认 | FALSE |
由本地客户端启用共享内存连接。该选项仅在Windows上可用。
--shared-memory-base-name=
name
| 属性 | 值 |
|---|---|
| 命令行格式 | --shared-memory-base-name=name |
| 系统变量 | shared_memory_base_name |
| 范围 | 全球 |
| 动态 | 没有 |
| 平台特定 | 视窗 |
| 类型 | 串 |
| 默认 | MYSQL |
用于共享内存连接的共享内存的名称。该选项仅在Windows上可用。默认名称是MYSQL。名称区分大小写。
关闭在MyISAM表格上同时选择和插入的功能
。(只有在您认为您在此功能中发现错误时才会使用该功能。)请参见
第8.11.3节“并发插入”。
| 属性 | 值 |
|---|---|
| 命令行格式 |
|
打开事件调度程序OFF。这与禁用需要设置的Event Scheduler不同
--event-scheduler=DISABLED; 看到
该
--event-scheduler选项,以获取更多信息。
此选项使服务器根本无需使用权限系统即可启动,这使得任何访问服务器的人都可以不受限制地访问所有数据库。您可以通过在系统shell中执行mysqladmin flush-privileges或mysqladmin reload命令,或者FLUSH PRIVILEGES
在连接到服务器后发出MySQL 语句,使运行中的服务器再次开始使用授权表。
此选项还会导致服务器在其启动序列中禁止加载随INSTALL PLUGIN语句安装的用户定义函数(UDF),预定事件和插件
。无论如何要导致插件被加载,请使用该
--plugin-load选项。
--skip-grant-tables也会导致disabled_storage_engines
系统变量无效。
FLUSH PRIVILEGES可能会由启动后执行的其他操作隐式执行。例如,mysql_upgrade在升级过程中刷新权限。
禁用内部主机缓存以加快名称到IP解析的速度。在这种情况下,每次客户端连接时,服务器都会执行DNS查找。请参见 第8.12.5.2节“DNS查找优化和主机缓存”。
使用--skip-host-cache类似于将host_cache_size系统变量设置
为0,但
host_cache_size更灵活,因为它也可用于在运行时调整,启用或禁用主机缓存,而不仅仅是在服务器启动时。
如果启动服务器时
--skip-host-cache,不会阻止对其值进行
host_cache_size更改,但此类更改不起作用,即使host_cache_size设置为大于0 ,缓存也不会重新启用
。
禁用InnoDB存储引擎。在这种情况下,因为默认存储引擎是
InnoDB,服务器将不会启动,除非您还使用
--default-storage-engine并将
--default-tmp-storage-engine默认值设置为其他引擎的永久和
TEMPORARY表。
从MySQL 5.7.5开始,InnoDB存储引擎不能再被禁用,并且该
--skip-innodb
选项已被弃用且不起作用。它的使用导致警告。该选项将在未来的MySQL版本中删除。
检查客户端连接时不要解析主机名。只使用IP地址。如果使用此选项,Host授予表中的所有列值都
必须是IP地址。请参见第8.12.5.2节“DNS查找优化和主机缓存”。
根据系统的网络配置和
Host帐户值,客户端可能需要使用显式--host
选项(如--host=127.0.0.1或)
进行连接--host=::1。
尝试连接到主机127.0.0.1
通常会解析为该localhost帐户。但是,如果服务器使用该--skip-name-resolve选项运行,则会失败
,因此请确保存在可以接受连接的帐户。例如,要能够root
使用--host=127.0.0.1或
--host=::1创建这些帐户,请执行以下操作:
CREATE USER'root'@'127.0.0.1'IDENTIFIED BY'root-password'; CREATE USER'root'@':: 1'IDENTIFIED BY'root-password';
根本不要听TCP / IP连接。所有与mysqld的交互都必须使用命名管道或共享内存(在Windows上)或Unix套接字文件(在Unix上)进行。强烈建议仅允许本地客户端的系统使用此选项。请参见第8.12.5.2节“DNS查找优化和主机缓存”。
| 属性 | 值 |
|---|---|
| 命令行格式 |
|
| 弃用 | 16年7月5日 |
禁用用户定义的分区。使用SHOW TABLES或通过查询
表可以查看分区表INFORMATION_SCHEMA.TABLES,但无法创建或修改分区表,也无法访问这些表中的数据。INFORMATION_SCHEMA.PARTITIONS
表中显示的所有分区专用列
NULL。
由于DROP TABLE删除了表格定义(.frm)文件,即使在使用该选项禁用分区时,该语句也可以在分区表格上工作。但是,该语句在这种情况下不会删除与分区表关联的分区定义。出于这个原因,您应该避免在禁用分区的情况下删除分区表,或者采取措施.par手动删除孤立文件(如果存在)。
从MySQL 5.7.6开始,.par不再为分区InnoDB表创建分区定义()文件。相反,分区定义存储在
InnoDB内部数据字典中。分区定义(.par)文件继续用于分区
MyISAM表。
此选项在MySQL 5.7.16中不推荐使用,并从MySQL 8.0中删除,因为在MySQL 8.0中,分区引擎被本地分区取代,而分区引擎无法禁用。
开头的选项--ssl
指定是否允许客户端使用SSL进行连接,并指明在哪里可以找到SSL密钥和证书。请参见
第6.4.2节“加密连接的命令选项”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --standalone |
| 平台特定 | 视窗 |
仅在Windows上可用; 指示MySQL服务器不作为服务运行。
| 属性 | 值 |
|---|---|
| 命令行格式 | --super-large-pages |
| 平台特定 | 的Solaris |
| 类型(Solaris) | 布尔 |
| 默认(Solaris) | FALSE |
标准使用MySQL中的大页面将尝试使用支持的最大大小,最大为4MB。在Solaris下,
“ 超大页面 ”功能可以使用最多256MB的页面。此功能适用于最新的SPARC平台。可以使用--super-large-pages或
--skip-super-large-pages
选项启用或禁用它
。
--symbolic-links,
--skip-symbolic-links
| 属性 | 值 |
|---|---|
| 命令行格式 | --symbolic-links |
| 类型 | 布尔 |
| 默认 | ON |
启用或禁用符号链接支持。在Unix上,启用符号链接意味着您可以使用语句或
选项
将MyISAM索引文件或数据文件链接
到另一个目录。如果删除或重命名该表,其符号链接指向的文件也将被删除或重命名。请参见
第8.12.3.2节“在Unix上使用MyISAM表的符号链接”。
INDEX DIRECTORYDATA DIRECTORYCREATE TABLE
这个选项在Windows上没有意义。
| 属性 | 值 |
|---|---|
| 命令行格式 | --skip-show-database |
| 系统变量 | skip_show_database |
| 范围 | 全球 |
| 动态 | 没有 |
该选项设置skip_show_database控制谁可以使用该SHOW DATABASES语句的
系统变量
。请参见
第5.1.5节“服务器系统变量”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --skip-stack-trace |
不要写入堆栈跟踪。当您在调试器下运行mysqld时,此选项很有用。在某些系统上,您还必须使用此选项来获取核心文件。请参见 第28.5节“调试和移植MySQL”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --slow-query-log |
| 系统变量 | slow_query_log |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
指定最初的慢查询日志状态。如果没有参数或参数为1,则该
--slow-query-log选项将启用日志。如果省略或用0的参数给出,则该选项将禁用日志。
| 属性 | 值 |
|---|---|
| 命令行格式 | --slow-start-timeout=# |
| 类型(Windows) | 整数 |
| 默认(Windows) | 15000 |
该选项控制Windows服务控制管理器的服务启动超时。该值是在启动期间尝试终止Windows服务之前服务控制管理器等待的最大毫秒数。默认值是15000(15秒)。如果MySQL服务启动时间过长,则可能需要增加此值。值为0意味着没有超时。
| 属性 | 值 |
|---|---|
| 命令行格式 | --socket={file_name|pipe_name} |
| 系统变量 | socket |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型(其他) | 串 |
| 类型(Windows) | 串 |
| 默认(其他) | /tmp/mysql.sock |
| 默认(Windows) | MySQL |
在Unix上,该选项指定侦听本地连接时使用的Unix套接字文件。默认值是
/tmp/mysql.sock。如果给出该选项,服务器将在数据目录中创建文件,除非给出绝对路径名来指定不同的目录。在Windows上,该选项指定在侦听使用命名管道的本地连接时使用的管道名称。默认值是MySQL(不区分大小写)。
--sql-mode=
value[,value[,value...]]
| 属性 | 值 |
|---|---|
| 命令行格式 | --sql-mode=name |
| 系统变量 | sql_mode |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 组 |
| 默认(> = 5.7.8) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION |
| 默认(5.7.7) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION |
| 默认(> = 5.7.5,<= 5.7.6) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION |
| 默认(<= 5.7.4) | NO_ENGINE_SUBSTITUTION |
| 有效值 |
|
设置SQL模式。请参见第5.1.8节“服务器SQL模式”。
MySQL安装程序可能会在安装过程中配置SQL模式。例如,
mysql_install_db将创建一个my.cnf在基本安装目录中指定的默认选项文件。该文件包含设置SQL模式的行; 请参见第4.4.2节“ mysql_install_db - 初始化MySQL数据目录”。
如果SQL模式与默认或预期不同,请检查服务器在启动时读取的选项文件中的设置。
| 属性 | 值 |
|---|---|
| 命令行格式 | --sysdate-is-now |
| 类型 | 布尔 |
| 默认 | FALSE |
SYSDATE()默认情况下返回它执行的时间,而不是它开始执行的语句的时间。这与行为有所不同NOW()。该选项会SYSDATE()成为别名NOW()。有关二进制日志和复制的影响的信息,请参阅用于描述
SYSDATE()在
12.7节,“日期和时间函数”和SET
TIMESTAMP在
第5.1.5节,“服务器系统变量”。
--tc-heuristic-recover={COMMIT|ROLLBACK}
| 属性 | 值 |
|---|---|
| 命令行格式 | --tc-heuristic-recover=name |
| 类型 | 列举 |
| 默认 | COMMIT |
| 有效值 |
|
在启发式恢复过程中使用的决策类型。要使用此选项,必须安装两个或多个支持XA事务的存储引擎 。
在MySQL 5.7.8之前,服务器--tc-heuristic-recover由于错误的错误而错误地解释
选项值(错误#70860)。
| 属性 | 值 |
|---|---|
| 命令行格式 | --temp-pool |
| 弃用 | 5.7.18 |
| 类型(其他) | 布尔 |
| 类型(Linux) | 布尔 |
| 默认(其他) | FALSE |
| 默认(Linux) | TRUE |
该选项在Linux上除外。在Linux上,它会导致服务器创建的大多数临时文件使用一小组名称,而不是每个新文件的唯一名称。这个解决了Linux内核中处理创建具有不同名称的许多新文件的问题。由于旧行为,Linux似乎“ 泄漏 ”了内存,因为它正被分配到目录条目缓存而不是磁盘缓存。
从MySQL 5.7.18开始,此选项已被弃用,并在MySQL 8.0中被删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --transaction-isolation=name |
| 系统变量(> = 5.7.20) | transaction_isolation |
| 范围(> = 5.7.20) | 全球,会议 |
| 动态(> = 5.7.20) | 是 |
| 类型 | 列举 |
| 默认 | REPEATABLE-READ |
| 有效值 |
|
设置默认事务隔离级别。该
level值可以是
READ-UNCOMMITTED,
READ-COMMITTED,
REPEATABLE-READ,或
SERIALIZABLE。请参见
第13.3.6节“SET TRANSACTION语法”。
默认事务隔离级别也可以在运行时使用该SET
TRANSACTION语句或通过设置
tx_isolation(或者截至MySQL 5.7.20
transaction_isolation)系统变量来设置。
| 属性 | 值 |
|---|---|
| 命令行格式 | --transaction-read-only |
| 系统变量(> = 5.7.20) | transaction_read_only |
| 范围(> = 5.7.20) | 全球,会议 |
| 动态(> = 5.7.20) | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
设置默认的事务访问模式。默认情况下,只读模式被禁用,所以模式是可读写的。
要在运行时设置默认事务访问模式,请使用该
SET TRANSACTION语句或设置tx_read_only(或者,自MySQL 5.7.20开始
transaction_read_only)系统变量。请参见第13.3.6节“SET TRANSACTION语法”。
--tmpdir=,
dir_name-t
dir_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --tmpdir=dir_name |
| 系统变量 | tmpdir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
用于创建临时文件的目录的路径。如果您的默认/tmp
目录驻留在太小而不能容纳临时表的分区上,可能会很有用。该选项接受几种以循环方式使用的路径。路径应该由:Unix上的冒号()和;Windows上的分号()分隔。如果MySQL服务器充当复制从服务器,则不应将其设置
--tmpdir为指向基于内存的文件系统上的目录或指向服务器主机重新启动时清除的目录。有关临时文件存储位置的更多信息,请参阅
第B.5.3.5节“MySQL存储临时文件的位置”。复制从服务器需要一些临时文件才能在计算机重新启动后存活,以便它可以复制临时表或
LOAD DATA
INFILE操作。如果服务器重新启动时临时文件目录中的文件丢失,则复制失败。
--user={,
user_name|user_id}-u
{
user_name|user_id}
| 属性 | 值 |
|---|---|
| 命令行格式 | --user=name |
| 类型 | 串 |
以具有名称或数字用户标识的用户身份运行mysqld服务器。(在这种情况下,“ 用户 ”是指系统登录帐户,而不是授权表中列出的MySQL用户。)
user_nameuser_id
此选项强制启动时
的mysqld为root。服务器在其启动顺序期间更改其用户标识,使其作为特定用户而不是作为特定用户运行
root。参见
第6.1.1节“安全指南”。
为了避免用户--user=root在my.cnf文件中添加选项
(从而导致服务器运行root)的可能的安全漏洞
,mysqld
仅使用--user
指定的第一个选项,并在存在多个--user选项时生成警告
。在选项
/etc/my.cnf和
$MYSQL_HOME/my.cnf之前的命令行选项的处理方法,所以建议你把
--user在选项
/etc/my.cnf并指定以外的值root。选项in
/etc/my.cnf在任何其他--user选项之前找到
,这确保了服务器以非
root,如果--user找到其他选项,则会发出警告。
使用此选项和--help
选项可获得详细帮助。
--version, -V
显示版本信息并退出。
MySQL服务器维护许多系统变量,指出它如何配置。每个系统变量都有一个默认值。可以在服务器启动时使用命令行上的选项或选项文件来设置系统变量。它们中的大多数可以在运行时使用该SET
语句动态更改
,这使您可以修改服务器的操作,而无需停止并重新启动它。您也可以在表达式中使用系统变量值。
在运行时,设置系统变量的全局值通常需要SUPER特权,但在各个变量描述中有例外情况。对于某些系统变量,设置会话值还需要
SUPER特权; 再次,个别变量描述中有例外情况。
有几种方法可以查看系统变量的名称和值:
要查看服务器将基于其编译的默认值以及它读取的任何选项文件使用的值,请使用以下命令:
mysqld --verbose --help
要根据其编译的默认值查看服务器将使用的值,忽略任何选项文件中的设置,请使用以下命令:
mysqld - 无默认--verbose --help
要查看正在运行的服务器使用的当前值,请使用该
SHOW VARIABLES语句或Performance Schema系统变量表。请参见
第25.11.13节“性能模式系统变量表”。
本部分包含一个列出所有系统变量的表格,下表提供了每个变量的描述。所有MySQL 5.7版本都提供没有指定版本的变量。有关操作系统变量的更多信息,请参见第5.1.6节“使用系统变量”。
表5.2系统变量摘要
笔记:
1.此选项是动态的,但只有服务器应设置此信息。你不应该手动设置这个变量的值。
有关其他系统变量信息,请参阅以下部分:
第5.1.6节“使用系统变量”讨论了设置和显示系统变量值的语法。
5.1.6.2节“动态系统变量”列出了可以在运行时设置的变量。
有关调整系统变量的信息可以在 第5.1.1节“配置服务器”中找到。
第14.14节“InnoDB启动选项和系统变量”列出了
InnoDB系统变量。
第21.3.3.9.2节“NDB群集系统变量”列出了特定于NDB群集的系统变量。
有关特定于复制的服务器系统变量的信息,请参见第16.1.6节“复制和二进制日志记录选项和变量”。
以下一些变量描述涉及
“ 启用 ”或“ 禁用 ”变量。可以通过将这些变量SET
设置为ON或
来启用这些变量1,或者通过将它们设置为OFF或来禁用
这些变量
0。布尔变量可以在启动时被设置为的值
ON,TRUE,
OFF,和FALSE(不区分大小写),以及1和
0。请参见第4.2.5节“程序选项修改器”。
一些系统变量控制缓冲区或缓存的大小。对于给定的缓冲区,服务器可能需要分配内部数据结构。这些结构通常是从分配给缓冲区的总内存中分配的,而所需的空间量可能与平台有关。这意味着,当您为控制缓冲区大小的系统变量赋值时,实际可用的空间量可能与指定的值不同。在某些情况下,金额可能小于指定的金额。服务器也可能会向上调整一个值。例如,如果将值0赋予最小值为1024的变量,则服务器将将该值设置为1024。
除非另有说明,缓冲区大小,长度和堆栈大小的值以字节为单位给出。
一些系统变量采用文件名称值。除非另有说明,否则如果该值是相对路径名称,则默认文件位置是数据目录。要明确指定位置,请使用绝对路径名称。假设数据目录是
/var/mysql/data。如果文件值变量是作为相对路径名给出的,它将位于下方
/var/mysql/data。如果该值是绝对路径名,则其位置如路径名所示。
authentication_windows_log_level
| 属性 | 值 |
|---|---|
| 命令行格式 | --authentication-windows-log-level |
| 介绍 | 5.7.9 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 4 |
只有authentication_windows启用Windows身份验证插件并启用调试代码时,此变量才可用
。请参见
第6.5.1.7节“Windows可插入验证”。
该变量设置Windows身份验证插件的日志记录级别。下表显示了允许的值。
| 值 | 描述 |
|---|---|
| 0 | 没有记录 |
| 1 | 仅记录错误消息 |
| 2 | 记录1级消息和警告消息 |
| 3 | 日志级别2消息和信息注释 |
| 4 | 记录3级消息和调试消息 |
这个变量是在MySQL 5.7.9中添加的。
authentication_windows_use_principal_name
| 属性 | 值 |
|---|---|
| 命令行格式 | --authentication-windows-use-principal-name |
| 介绍 | 5.7.9 |
| 类型 | 布尔 |
| 默认 | ON |
只有authentication_windows启用Windows身份验证插件时,此变量才可用
。请参见
第6.5.1.7节“Windows可插入验证”。
使用InitSecurityContext()函数进行身份验证的客户端
应该提供一个字符串来标识它所连接的服务(targetName)。MySQL使用运行服务器的帐户的主体名称(UPN)。UPN具有表格
,不需要在任何地方注册即可使用。此UPN由服务器在身份验证握手开始时发送。
user_id@computer_name
此变量控制服务器在初始质询中是否发送UPN。默认情况下,该变量已启用。出于安全原因,可以禁用该功能,以避免以明文形式将服务器的帐户名发送给客户端。如果该变量被禁用,则服务器始终0x00在第一个质询中发送一个
字节,客户端不指定targetName,因此使用NTLM身份验证。
如果服务器无法获得其UPN(主要发生在不支持Kerberos认证的环境中),则服务器不会发送UPN,并使用NTLM认证。
这个变量是在MySQL 5.7.9中添加的。
| 属性 | 值 |
|---|---|
| 命令行格式 | --autocommit[=#] |
| 系统变量 | autocommit |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | ON |
自动提交模式。如果设置为1,则对表的所有更改立即生效。如果设置为0,则必须使用
COMMIT接受事务或ROLLBACK
取消事务。如果autocommit
为0,并将其更改为1,则MySQL会自动执行
COMMIT任何打开的事务。开始交易的另一种方式是使用一个START
TRANSACTION或
一个
BEGIN
声明。请参见第13.3.1节“START TRANSACTION,COMMIT和ROLLBACK语法”。
默认情况下,客户端连接开始时
autocommit设置为1.要使客户端以默认值0 autocommit开始,请使用--autocommit=0选项启动服务器来设置全局
值
。要使用选项文件设置变量,请包含以下行:
的[mysqld] 自动提交= 0
| 属性 | 值 |
|---|---|
| 系统变量 | automatic_sp_privileges |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | TRUE |
当该变量具有1(默认值)的一个值时,服务器自动授予
EXECUTE和
ALTER ROUTINE特权一个存储程序的创建者,如果用户已经不能执行和变更或删除该程序。(
ALTER ROUTINE需要特权才能删除例程。)当例程被删除时,服务器也会自动从创建者那里删除这些特权。如果
automatic_sp_privileges为0,则服务器不会自动添加或删除这些权限。
例程的创建者是用于为其执行CREATE语句的帐户
。这可能与DEFINER在例程定义中以名称命名的帐户
不同。
| 属性 | 值 |
|---|---|
| 命令行格式 | --auto-generate-certs[={OFF|ON}] |
| 介绍 | 5.7.5 |
| 系统变量 | auto_generate_certs |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 布尔 |
| 默认 | ON |
如果服务器使用OpenSSL进行编译,则此变量可用(请参见第6.4.4节“OpenSSL与yaSSL”)。它控制服务器是否自动生成数据目录中的SSL密钥和证书文件(如果它们尚不存在)。
启动时,如果auto_generate_certs启用了系统变量,未--ssl指定SSL选项
以及数据中缺少服务器端SSL文件,则服务器会自动在数据目录中生成服务器端和客户端SSL证书和密钥文件
目录。这些文件使用SSL实现安全的客户端连接; 请参见
第6.4.1节“配置MySQL以使用加密连接”。
有关SSL文件自动生成的更多信息,包括文件名和特征,请参见 第6.4.3.1节“使用MySQL创建SSL和RSA证书和密钥”
该
sha256_password_auto_generate_rsa_keys
系统变量相关,但所需要的使用RSA在unencypted连接的安全密码交换RSA密钥对文件控制自动生成。
| 属性 | 值 |
|---|---|
| 命令行格式 | --avoid-temporal-upgrade={OFF|ON} |
| 介绍 | 5.7.6 |
| 弃用 | 5.7.6 |
| 系统变量 | avoid_temporal_upgrade |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
这个变量控制是否ALTER
TABLE隐式升级发现在预5.6.4格式颞柱(TIME,
DATETIME,和
TIMESTAMP列不为小数精度秒支持)。升级这些列需要进行表重建,这可以防止任何可能适用于要执行的操作的快速更改。
这个变量默认是禁用的。启用它
ALTER TABLE不会重建时间列,从而能够利用可能的快速更改。
此变量已弃用,将在未来的MySQL版本中删除。
| 属性 | 值 |
|---|---|
| 系统变量 | back_log |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | -1 (autosized) |
| 最低限度 | 1 |
| 最大 | 65535 |
MySQL可以有未完成的连接请求的数量。当主MySQL线程在非常短的时间内获得非常多的连接请求时,这会发挥作用。然后,主线程需要一段时间(尽管很少)检查连接并启动一个新线程。该
back_log值表示在MySQL短暂停止回答新请求之前的这段短时间内可以堆叠多少个请求。只有当您期望在短时间内有大量连接时,您才需要增加此功能。
换句话说,这个值是传入TCP / IP连接的监听队列的大小。您的操作系统对此队列的大小有自己的限制。Unix listen()系统调用的手册页
应该有更多的细节。检查您的操作系统文档以获取此变量的最大值。back_log
不能设置为高于您的操作系统限制。
默认值基于以下公式,上限为900:
50 +(max_connections / 5)
| 属性 | 值 |
|---|---|
| 命令行格式 | --basedir=dir_name |
| 系统变量 | basedir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
MySQL安装基本目录的路径。
| 属性 | 值 |
|---|---|
| 命令行格式 | --big-tables |
| 系统变量 | big_tables |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
如果设置为1,则所有临时表都存储在磁盘上而不是内存中。这有点慢,但对于需要大型临时表的操作不会发生
错误
。新连接的默认值为0(使用内存中的临时表)。通常,您不需要设置此变量,因为根据需要将内存表自动转换为基于磁盘的表。
The table tbl_name is
fullSELECT
| 属性 | 值 |
|---|---|
| 命令行格式 | --bind-address=addr |
| 系统变量 | bind_address |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
| 默认 | * |
--bind-address
选项
的值。
这个变量对嵌入式服务器(libmysqld)没有任何影响,从MySQL 5.7.2开始,在嵌入式服务器中不再可见。
| 属性 | 值 |
|---|---|
| 命令行格式 | --block-encryption-mode=# |
| 介绍 | 5.7.4 |
| 系统变量 | block_encryption_mode |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | aes-128-ecb |
此变量控制基于块的算法(如AES)的块加密模式。它影响AES_ENCRYPT()和
加密
AES_DECRYPT()。
block_encryption_mode以
格式取值
,其中密钥长度以位为单位,并且是加密模式。该值不区分大小写。允许的
值是128,192和256.允许的加密模式取决于MySQL是使用OpenSSL还是使用yaSSL编译的:
aes-keylen-modekeylenmodekeylen
加入OpenSSL,允许mode
的值是:ECB,
CBC,CFB1,
CFB8,CFB128,
OFB
对于yaSSL,允许的mode
值为:ECB,CBC
例如,此语句会导致AES加密函数使用256位的密钥长度和CBC模式:
SET block_encryption_mode ='aes-256-cbc';
尝试设置block_encryption_mode为包含不受支持的密钥长度或SSL库不支持的模式的值时发生错误
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --bulk-insert-buffer-size=# |
| 系统变量 | bulk_insert_buffer_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 8388608 |
| 默认(32位平台) | 8388608 |
| 最低(64位平台) | 0 |
| 最低(32位平台) | 0 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
MyISAM使用一种特殊的树状缓存来做出更快的批量插入
INSERT ...
SELECT,INSERT ... VALUES (...), (...),
...以及
LOAD DATA
INFILE对非空表添加数据时。这个变量限制了每个线程缓存树的大小(以字节为单位)。将其设置为0将禁用此优化。默认值是8MB。
| 属性 | 值 |
|---|---|
| 系统变量 | character_set_client |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
从客户端到达的语句的字符集。当客户端连接到服务器时,使用客户端请求的字符集设置此变量的会话值。(许多客户端支持--default-character-set显式指定该字符集的
选项,另请参见
第10.4节“连接字符集和排序规则”。)变量的全局值用于在客户端请求的情况下设置会话值值未知或不可用,或者服务器配置为忽略客户端请求:
客户端来自MySQL 4.1之前版本的MySQL,因此不会请求字符集。
客户端请求服务器不知道的字符集。例如,启用日语的客户端sjis在连接到未配置sjis支持的服务器时请求
。
mysqld是通过该--skip-character-set-client-handshake
选项启动的
,导致它忽略客户端字符集配置。这再现了MySQL 4.0的行为,如果您希望在不升级所有客户端的情况下升级服务器,那么这很有用。
ucs2,utf16,
utf16le,并utf32
不能作为客户端字符集,这意味着他们还没有为工作SET
NAMES或SET CHARACTER
SET。
| 属性 | 值 |
|---|---|
| 系统变量 | character_set_connection |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
用于没有字符集介绍器和数字到字符串转换的文字的字符集。有关介绍人的信息,请参见 第10.3.8节“字符集介绍人”。
| 属性 | 值 |
|---|---|
| 系统变量 | character_set_database |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | latin1 |
| 脚注 | 此选项是动态的,但只有服务器应设置此信息。你不应该手动设置这个变量的值。 |
由默认数据库使用的字符集。服务器在默认数据库更改时设置此变量。如果没有默认数据库,则该变量的值与character_set_server。
全局
变量character_set_database和
collation_database系统变量从MySQL 5.7.6开始不推荐使用,并且将在未来版本的MySQL中删除。
为会话
character_set_database和
collation_database系统变量赋值是从MySQL 5.7.6开始不推荐使用的,赋值会产生一个警告。会话变量将仅在未来版本的MySQL中变为只读,并且分配会产生错误。访问会话变量以确定默认数据库的数据库字符集和排序规则仍然是可能的。
| 属性 | 值 |
|---|---|
| 命令行格式 | --character-set-filesystem=name |
| 系统变量 | character_set_filesystem |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | binary |
文件系统字符集。此变量用于解释引用文件名的字符串文字,例如在LOAD DATA
INFILE和
SELECT ... INTO
OUTFILE语句和
LOAD_FILE()函数中。这样的文件名从转换
character_set_client到
character_set_filesystem
发生文件打开尝试之前。默认值是
binary,这意味着不发生转换。对于允许多字节文件名的系统,不同的值可能更合适。例如,如果系统使用UTF-8表示文件名,则设置
character_set_filesystem为
'utf8'。
| 属性 | 值 |
|---|---|
| 系统变量 | character_set_results |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
用于将查询结果(如结果集或错误消息)返回给客户端的字符集。
| 属性 | 值 |
|---|---|
| 命令行格式 | --character-set-server |
| 系统变量 | character_set_server |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | latin1 |
服务器的默认字符集。
| 属性 | 值 |
|---|---|
| 系统变量 | character_set_system |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
| 默认 | utf8 |
服务器用于存储标识符的字符集。价值永远是utf8。
| 属性 | 值 |
|---|---|
| 命令行格式 | --character-sets-dir=dir_name |
| 系统变量 | character_sets_dir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
安装字符集的目录。
| 属性 | 值 |
|---|---|
| 命令行格式 | --check-proxy-users=[={OFF|ON}] |
| 介绍 | 5.7.7 |
| 系统变量 | check_proxy_users |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
此变量控制服务器是否为请求它的认证插件执行代理用户映射。与
check_proxy_users启用,它也可能需要启用特定插件,系统变量,以利用代理服务器用户映射的支持:
对于mysql_native_password插件,启用
mysql_native_password_proxy_users。
对于sha256_password插件,启用
sha256_password_proxy_users。
有关用户代理的信息,请参见 第6.3.10节“代理用户”。
这个变量是在MySQL 5.7.7中添加的。在5.7.7之前,代理用户映射仅适用于为其自身实现的插件。
| 属性 | 值 |
|---|---|
| 系统变量 | collation_connection |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
连接字符集的排序规则。
| 属性 | 值 |
|---|---|
| 系统变量 | collation_database |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | latin1_swedish_ci |
| 脚注 | 此选项是动态的,但只有服务器应设置此信息。你不应该手动设置这个变量的值。 |
默认数据库使用的排序规则。服务器在默认数据库更改时设置此变量。如果没有默认数据库,则该变量的值与
collation_server。
全局
变量character_set_database和
collation_database系统变量从MySQL 5.7.6开始不推荐使用,并且将在未来版本的MySQL中删除。
为会话
character_set_database和
collation_database系统变量赋值是从MySQL 5.7.6开始不推荐使用的,赋值会产生一个警告。会话变量将仅在未来版本的MySQL中变为只读,并且分配会产生错误。访问会话变量以确定默认数据库的数据库字符集和排序规则仍然是可能的。
| 属性 | 值 |
|---|---|
| 命令行格式 | --collation-server |
| 系统变量 | collation_server |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | latin1_swedish_ci |
服务器的默认排序规则。
| 属性 | 值 |
|---|---|
| 命令行格式 | --completion-type=# |
| 系统变量 | completion_type |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | NO_CHAIN |
| 有效值 |
|
交易完成类型。该变量可以采用下表中显示的值。该变量可以使用名称值或相应的整数值进行分配。
| 值 | 描述 |
|---|---|
NO_CHAIN (或0) |
COMMIT并
ROLLBACK
不受影响。这是默认值。 |
CHAIN (或1) |
COMMIT并
ROLLBACK
分别相当于COMMIT AND CHAIN
和ROLLBACK AND CHAIN。(新事务立即开始,与刚刚终止的事务具有相同的隔离级别。) |
RELEASE (或2) |
COMMIT并
ROLLBACK
分别相当于COMMIT RELEASE和
ROLLBACK RELEASE。(服务器在终止事务后断开连接。) |
completion_type会影响首先交易
START
TRANSACTION或
BEGIN和结束COMMIT或
ROLLBACK。它不适用于执行第13.3.3节“导致隐式提交的语句”中列出的语句的隐式提交。它也没有申请
XA
COMMIT,
XA
ROLLBACK或当
autocommit=1。
| 属性 | 值 |
|---|---|
| 命令行格式 | --concurrent-insert[=#] |
| 系统变量 | concurrent_insert |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | AUTO |
| 有效值 |
|
如果AUTO(缺省值),MySQL允许
INSERT和
SELECT语句对MyISAM数据文件中间没有空闲块的表同时运行。如果启动
mysqld的使用
--skip-new,这个变量被设置为NEVER。
该变量可以采用下表中显示的值。该变量可以使用名称值或相应的整数值进行分配。
| 值 | 描述 |
|---|---|
NEVER (或0) |
禁用并发插入 |
AUTO (或1) |
(默认)为MyISAM没有孔的表启用并发插入 |
ALWAYS (或2) |
为所有MyISAM表启用并发插入,即使那些有漏洞的表也是如此。对于有孔的表格,如果新表格被另一个线程使用,则表格末尾会插入新行。否则,MySQL会获得一个正常的写入锁定并将该行插入到该洞中。 |
| 属性 | 值 |
|---|---|
| 命令行格式 | --connect-timeout=# |
| 系统变量 | connect_timeout |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 10 |
| 最低限度 | 2 |
| 最大 | 31536000 |
mysqld
服务器在响应之前等待连接数据包
的秒数Bad handshake。默认值是10秒。
connect_timeout如果客户经常遇到表单错误,
增加
值可能会有所帮助
。
Lost connection to MySQL server at
'XXX', system error:
errno
| 属性 | 值 |
|---|---|
| 系统变量 | core_file |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 布尔 |
| 默认 | OFF |
是否在服务器崩溃时编写核心文件。该变量由--core-file选项设置
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --datadir=dir_name |
| 系统变量 | datadir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
MySQL服务器数据目录的路径。相对路径根据当前目录进行解析。如果服务器将自动启动(即,在无法假定当前目录是什么的情况下),最好将该datadir值指定
为绝对路径。
这个变量未被使用。它已被弃用,并在MySQL 8.0中被删除。
这个变量未被使用。它已被弃用,并在MySQL 8.0中被删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --debug[=debug_options] |
| 系统变量 | debug |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(Windows) | 串 |
| 类型(Unix) | 串 |
| 默认(Windows) | d:t:i:O,\mysqld.trace |
| 默认(Unix) | d:t:i:o,/tmp/mysqld.trace |
这个变量表示当前的调试设置。它仅适用于使用调试支持构建的服务器。初始值来自--debug服务器启动时给出的选项实例的值
。全局和会话值可以在运行时设置; 该SUPER特权是必需的,即使是会话价值。
分配以当前值加上或从当前值减去值开始的值+或
-导致值:
mysql>SET debug = 'T';mysql>SELECT @@debug;+ --------- + | @@ debug | + --------- + | T | + --------- + mysql>SET debug = '+P';mysql>SELECT @@debug;+ --------- + | @@ debug | + --------- + | P:T | + --------- + mysql>SET debug = '-P';mysql>SELECT @@debug;+ --------- + | @@ debug | + --------- + | T | + --------- +
有关更多信息,请参见第28.5.3节“DBUG包”。
| 属性 | 值 |
|---|---|
| 系统变量 | debug_sync |
| 范围 | 会议 |
| 动态 | 是 |
| 类型 | 串 |
该变量是Debug Sync工具的用户界面。使用Debug Sync要求使用CMake选项配置MySQL (请参见
第2.9.4节“MySQL源配置选项”)。如果没有编译调试同步,则此系统变量不可用。
-DENABLE_DEBUG_SYNC=1
全局变量值是只读的,并指示设施是否已启用。默认情况下,调试Sync被禁用和值debug_sync
是OFF。如果服务器开始
,这里是一个超时值大于0,调试同步启用和更大的价值
是其次是信号的名字。此外,
成为各个同步点的默认超时。
--debug-sync-timeout=NNdebug_syncON -
current signalN
会话值可以被任何用户读取,并且具有与全局变量相同的值。会话值可由具有SUPER控制同步点权限的用户设置
。
有关调试同步工具以及如何使用同步点的说明,请参阅 MySQL内部:测试同步。
| 属性 | 值 |
|---|---|
| 命令行格式 | --default-authentication-plugin=plugin_name |
| 介绍 | 5.7.2 |
| 系统变量 | default_authentication_plugin |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 列举 |
| 默认 | mysql_native_password |
| 有效值 |
|
默认身份验证插件。这些值是允许的:
mysql_native_password:使用MySQL本机密码; 请参见
第6.5.1.1节“本地可插入验证”。
sha256_password:使用SHA-256密码; 请参见第6.5.1.4节“SHA-256可插入验证”。
如果此变量的值不是以前的值
mysql_native_password,则MySQL 5.5.7以前的客户端无法连接,因为在允许的默认身份验证插件中,他们仅了解
mysql_native_password身份验证协议。
该
default_authentication_plugin
值影响服务器操作的这些方面:
它确定服务器将哪个认证插件分配给创建的新帐户,
CREATE USER以及
GRANT未明确指定认证插件的语句。
该old_passwords系统变量会影响使用该帐户的密码散列mysql_native_password或
sha256_password身份验证插件。如果默认身份验证插件是其中一个插件,则服务器将old_passwords在启动时将其设置
为插件密码哈希方法所需的值。
对于使用以下任一语句创建的帐户,服务器会将该帐户与默认身份验证插件相关联,并为该帐户分配给定密码,并根据该插件的要求进行散列:
CREATE USER ... IDENTIFIED BY'cleartext password'; GRANT ...由'cleartext password' 识别;
对于使用以下任一语句创建的帐户,如果密码哈希具有插件所需的格式,则服务器将该帐户与默认身份验证插件相关联,并为该帐户分配给定的密码哈希值:
创建用户...通过密码进行身份验证encrypted password“; 授予...由密码标识encrypted password“;
如果密码哈希不是默认身份验证插件所需的格式,则语句失败。
这个变量是在MySQL 5.7.2中添加的。早些时候在MySQL 5.7中,改用
--default-authentication-plugin
命令行选项,它在服务器启动时使用相同的方式,但不能在运行时访问。
| 属性 | 值 |
|---|---|
| 命令行格式 | --default-password-lifetime=# |
| 介绍 | 5.7.4 |
| 系统变量 | default_password_lifetime |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认(> = 5.7.11) | 0 |
| 默认(<= 5.7.10) | 360 |
| 最低限度 | 0 |
| 最大 | 65535 |
该变量定义全局自动密码过期策略。它适用于使用MySQL内置身份验证方法的帐户(使用mysql_native_password或
的身份验证插件的帐户sha256_password)。
默认
default_password_lifetime
值为0,禁用自动密码过期。如果值为
default_password_lifetime正整数N,则表示允许的密码生存期; 密码必须每天更改N。
使用ALTER USER
语句的密码过期选项,可以根据个人帐户的需要覆盖全局密码过期策略。请参见第6.3.7节“密码管理”。
从MySQL 5.7.4到5.7.10,默认
default_password_lifetime
值是360(密码必须每年大约更改一次)。对于这些版本,请注意,如果不对default_password_lifetime
变量或个人用户帐户进行更改
,所有用户密码将在360天后过期,并且所有用户帐户都将在受限模式下开始运行。连接到服务器的客户端(实际上是用户)将会收到一个错误消息,指出必须更改密码:
ERROR 1820 (HY000): You must reset your password
using ALTER USER statement before executing this
statement.
但是,对于自动连接到服务器的客户端(如使用脚本建立的连接),很容易错过。为避免由于密码过期而导致此类客户端突然停止工作,请确保为这些客户端更改密码到期设置,如下所示:
ALTER USER'script'@'localhost'密码永远不会出现
或者,将该default_password_lifetime
变量设置
为0,从而禁用所有用户的自动密码到期。
| 属性 | 值 |
|---|---|
| 命令行格式 | --default-storage-engine=name |
| 系统变量 | default_storage_engine |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | InnoDB |
默认的存储引擎。此变量仅设置永久表的存储引擎。要设置TEMPORARY表格的存储引擎,请设置
default_tmp_storage_engine
系统变量。
要查看哪些存储引擎可用并启用,请使用该SHOW ENGINES语句或查询INFORMATION_SCHEMA
ENGINES表。
default_storage_engine应该优先使用
storage_engine,这已被弃用,并在MySQL 5.7.5中被删除。
如果在服务器启动时禁用默认存储引擎,则必须将永久和TEMPORARY表的默认引擎设置为
不同的引擎,否则服务器将无法启动。
| 属性 | 值 |
|---|---|
| 命令行格式 | --default-tmp-storage-engine=name |
| 系统变量 | default_tmp_storage_engine |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | InnoDB |
TEMPORARY
表格
的默认存储引擎(用于创建
CREATE TEMPORARY
TABLE)。要设置永久表的存储引擎,请设置
default_storage_engine系统变量。另请参阅关于可能值的该变量的讨论。
如果在服务器启动时禁用默认存储引擎,则必须将永久和TEMPORARY表的默认引擎设置为
不同的引擎,否则服务器将无法启动。
| 属性 | 值 |
|---|---|
| 命令行格式 | --default-week-format=# |
| 系统变量 | default_week_format |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 7 |
用于该WEEK()功能的默认模式值
。请参见
第12.7节“日期和时间函数”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --delay-key-write[=name] |
| 系统变量 | delay_key_write |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | ON |
| 有效值 |
|
该选项仅适用于MyISAM表格。它可以具有以下值之一来影响DELAY_KEY_WRITE可以在CREATE TABLE
语句中使用的表选项的处理。
| 选项 | 描述 |
|---|---|
OFF |
DELAY_KEY_WRITE 被忽略。 |
ON |
MySQL支持DELAY_KEY_WRITE在CREATE TABLE语句中指定的任何选项
。这是默认值。 |
ALL |
所有新打开的表格都视为它们是在DELAY_KEY_WRITE启用该选项的情况下创建的
。 |
如果DELAY_KEY_WRITE对某个表启用,则不会在每次索引更新时为该表刷新关键缓冲区,但只有在该表关闭时才会刷新该表。这大大加快了对密钥的写操作,但是如果使用此功能,则应该MyISAM通过使用--myisam-recover-options选项(例如,
--myisam-recover-options=BACKUP,FORCE)启动服务器来添加所有表的
自动检查。请参见第5.1.4节“服务器命令选项”和
第15.2.1节“MyISAM启动选项”。
如果您启用外部锁定
--external-locking,则不会防止使用延迟密钥写入的表的索引损坏。
| 属性 | 值 |
|---|---|
| 命令行格式 | --delayed-insert-limit=# |
| 弃用 | 是 |
| 系统变量 | delayed_insert_limit |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 100 |
| 默认(32位平台) | 100 |
| 最低(64位平台) | 1 |
| 最低(32位平台) | 1 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
此系统变量已被弃用(因为
DELAYED不支持插入),并将在未来版本中删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --delayed-insert-timeout=# |
| 弃用 | 是 |
| 系统变量 | delayed_insert_timeout |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 300 |
此系统变量已被弃用(因为
DELAYED不支持插入),并将在未来版本中删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --delayed-queue-size=# |
| 弃用 | 是 |
| 系统变量 | delayed_queue_size |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 1000 |
| 默认(32位平台) | 1000 |
| 最低(64位平台) | 1 |
| 最低(32位平台) | 1 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
此系统变量已被弃用(因为
DELAYED不支持插入),并将在未来版本中删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --disabled-storage-engines=engine[,engine]... |
| 介绍 | 5.7.8 |
| 系统变量 | disabled_storage_engines |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
| 默认 | empty string |
该变量指示哪些存储引擎不能用于创建表或表空间。例如,要防止
创建新
表MyISAM或FEDERATED表,请使用服务器选项文件中的以下行启动服务器:
的[mysqld] disabled_storage_engines = “的MyISAM,FEDERATED”
默认情况下,
disabled_storage_engines为空(不禁用引擎),但可将其设置为一个或多个引擎的逗号分隔列表(不区分大小写)。任何在值命名的发动机不能用于创建表或表空间使用CREATE
TABLE或CREATE
TABLESPACE,并且不能与使用
ALTER TABLE ...
ENGINE或
ALTER
TABLESPACE ... ENGINE更改现有的表或表空间的存储引擎。尝试这样做会导致ER_DISABLED_STORAGE_ENGINE
错误。
disabled_storage_engines不限制为现有的表的其它DDL语句,比如
CREATE INDEX,
TRUNCATE TABLE,
ANALYZE TABLE,
DROP TABLE,或
DROP TABLESPACE。这允许平滑过渡,以便使用禁用引擎的现有表或表空间可以通过诸如以下方式迁移到允许的引擎
。
ALTER TABLE ...
ENGINE permitted_engine
允许将
系统变量default_storage_engine或
default_tmp_storage_engine系统变量设置
为禁用的存储引擎。这可能会导致应用程序行为不正常或失败,尽管这可能是开发环境中识别使用已禁用引擎的应用程序的一项有用技术,因此可以对其进行修改。
disabled_storage_engines被禁用,如果服务器开始的任何选项没有影响:--bootstrap,
--initialize,
--initialize-insecure,
--skip-grant-tables。
disconnect_on_expired_password
| 属性 | 值 |
|---|---|
| 命令行格式 | --disconnect-on-expired-password[=#] |
| 介绍 | 5.7.1 |
| 系统变量 | disconnect_on_expired_password |
| 范围 | 会议 |
| 动态 | 没有 |
| 类型 | 布尔 |
| 默认 | ON |
此变量控制服务器如何处理具有过期密码的客户端:
如果客户端指出它可以处理到期的密码,那么这个值
disconnect_on_expired_password
是无关紧要的。服务器允许客户端连接,但将其置于沙盒模式。
如果客户端没有指出它可以处理过期密码,则服务器根据以下值处理客户端
disconnect_on_expired_password:
如果
disconnect_on_expired_password:启用,服务器将断开客户端连接。
如果
disconnect_on_expired_password:被禁用,服务器将允许客户端连接,但将其置于沙箱模式。
有关与过期密码处理有关的客户端和服务器设置交互的更多信息,请参见 第6.3.8节“密码过期和沙盒模式”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --div-precision-increment=# |
| 系统变量 | div_precision_increment |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 4 |
| 最低限度 | 0 |
| 最大 | 30 |
该变量表示用于增加与/操作员执行的分割操作的结果的比例的位数
。默认值为4.最小值和最大值分别为0和30。以下示例说明了增加默认值的效果。
MySQL的>SELECT 1/7;+ -------- + | 1/7 | + -------- + | 0.1429 | + -------- + mysql>SET div_precision_increment = 12;mysql>SELECT 1/7;+ ---------------- + | 1/7 | + ---------------- + | 0.142857142857 | + ---------------- +
| 属性 | 值 |
|---|---|
| 系统变量 | end_markers_in_json |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
优化器JSON输出是否应该添加结束标记。请参阅 MySQL内部结构:end_markers_in_json系统变量。
| 属性 | 值 |
|---|---|
| 系统变量 | eq_range_index_dive_limit |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认(> = 5.7.4) | 200 |
| 默认(<= 5.7.3) | 10 |
| 最低限度 | 0 |
| 最大 | 4294967295 |
此变量指示优化程序在估算合格行数时应从使用索引潜水切换到索引统计数据时,在相等比较条件中的相等范围数。它适用于评估具有这些等价形式的表达式,其中优化器使用非唯一索引来查找
col_name值:
col_nameIN(val1,...,valN)col_name=val1OR ... ORcol_name=valN
在这两种情况下,表达式都包含
N相等范围。优化器可以使用索引潜水或索引统计进行行估计。如果eq_range_index_dive_limit
大于0,则优化程序使用现有的索引统计信息而不是索引潜水,如果存在
eq_range_index_dive_limit或多个相等范围。因此,要允许使用索引潜水达到N相等范围,请将其设置
eq_range_index_dive_limit为
N+1。要禁用索引统计并始终使用索引潜水
N,请将其设置
eq_range_index_dive_limit为0。
有关更多信息,请参阅 多值比较的等式范围优化。
要更新的最佳估计表索引统计信息,使用
ANALYZE TABLE。
最后一条生成消息的语句导致的错误数量。这个变量是只读的。请参见 第13.7.5.17节“SHOW ERRORS Syntax”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --event-scheduler[=value] |
| 系统变量 | event_scheduler |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | OFF |
| 有效值 |
|
该变量指示事件调度程序的状态; 可能的值是ON,,
OFF和DISABLED,默认值是OFF。这个变量及其对Event Scheduler操作的影响将在Events章节的Overview部分详细讨论
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --expire-logs-days=# |
| 系统变量 | expire_logs_days |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 99 |
自动二进制日志文件删除的天数。默认值为0,表示“ 不自动删除”。“ 可能的删除发生在启动时和二进制日志刷新。如第5.4节“MySQL服务器日志”所示,发生日志刷新 。
要手动删除二进制日志文件,请使用该
PURGE BINARY LOGS语句。请参见第13.4.1.1节“PURGE BINARY LOGS语法”。
explicit_defaults_for_timestamp
| 属性 | 值 |
|---|---|
| 命令行格式 | --explicit-defaults-for-timestamp=# |
| 弃用 | 是 |
| 系统变量 | explicit_defaults_for_timestamp |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
此系统变量确定服务器是否为默认值启用某些非标准行为,并确定
列中的NULL值处理
TIMESTAMP。默认情况下,
explicit_defaults_for_timestamp
被禁用,从而启用非标准行为。
如果
explicit_defaults_for_timestamp
禁用,服务器将启用非标准行为并处理TIMESTAMP列,如下所示:
TIMESTAMP未使用该NULL
属性显式声明的列将使用该属性自动声明NOT
NULL。分配这样一列的值NULL是允许的,并将列设置为当前时间戳。
TIMESTAMP如果未使用NULL属性或显式
DEFAULT或ON UPDATE
属性显式声明,则表中
的第一列
将使用DEFAULT CURRENT_TIMESTAMP和
ON UPDATE CURRENT_TIMESTAMP属性自动声明
。
TIMESTAMP如果未使用NULL属性或显式
DEFAULT属性显式声明,则第一个后面的列
自动声明为DEFAULT '0000-00-00
00:00:00'(“ 零 ”时间戳)。对于为这样的列指定没有显式值的插入行,该列将被分配'0000-00-00
00:00:00'并且不会发生警告。
根据是否NO_ZERO_DATE启用严格的SQL模式或
SQL模式,默认值'0000-00-00
00:00:00'可能无效。请注意,
TRADITIONALSQL模式包括严格模式和
NO_ZERO_DATE。请参见
第5.1.8节“服务器SQL模式”。
刚才描述的非标准行为已被弃用,并将在未来的MySQL版本中被删除。
如果
explicit_defaults_for_timestamp
启用,服务器将禁用非标准行为并处理TIMESTAMP列,如下所示:
无法为
TIMESTAMP列指定值
NULL以将其设置为当前时间戳。要分配当前时间戳,请将列设置为CURRENT_TIMESTAMP或同义词,如NOW()。
TIMESTAMP未使用NOT NULL
属性显式声明的列将使用NULL属性和许可
NULL值自动声明
。分配这样的列的值NULL集它
NULL,而不是当前时间戳。
TIMESTAMP使用NOT NULL属性声明的列不允许NULL值。对于NULL为这样的列指定的插入,结果可能是单行插入错误,或者启用了严格SQL模式,或者'0000-00-00
00:00:00'插入了严格SQL模式禁用的多行插入。在任何情况下,都不会将该列分配给NULL当前时间戳。
TIMESTAMP使用NOT NULL
属性显式声明并且没有显式
DEFAULT属性的列被视为没有默认值。对于为这样的列指定没有显式值的插入行,结果取决于SQL模式。如果启用严格的SQL模式,则会发生错误。如果没有启用严格的SQL模式,则使用隐式默认值声明该列,'0000-00-00
00:00:00'并发生警告。这与MySQL如何对待其他时态类型如
DATETIME。
没有TIMESTAMP列是使用DEFAULT
CURRENT_TIMESTAMPor ON UPDATE
CURRENT_TIMESTAMP属性自动声明的。这些属性必须明确指定。
如果
explicit_defaults_for_timestamp
在服务器启动时被禁用,则此警告将显示在错误日志中:
[Warning]带有隐式DEFAULT值的TIMESTAMP已弃用。 请使用--explicit_defaults_for_timestamp服务器选项(请参阅 文档更多细节)。
如警告所示,要禁用不建议使用的非标准行为,请explicit_defaults_for_timestamp
在服务器启动时启用
系统变量。
explicit_defaults_for_timestamp
本身已被弃用,因为它的唯一目的是允许控制TIMESTAMP将在未来的MySQL版本中被删除的弃用
行为。当消除这些行为时,
explicit_defaults_for_timestamp
将没有任何目的,并且将被删除。
有关更多信息,请参见 第11.3.5节“自动初始化和更新TIMESTAMP和DATETIME”。
| 属性 | 值 |
|---|---|
| 系统变量 | external_user |
| 范围 | 会议 |
| 动态 | 没有 |
| 类型 | 串 |
身份验证过程中使用的外部用户名,由用于验证客户端的插件设置。使用本地(内置)MySQL身份验证,或者如果插件未设置值,则此变量为NULL。参见第6.3.10节“代理用户”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --flush |
| 系统变量 | flush |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
如果ON服务器在每个SQL语句之后刷新(同步)所有对磁盘的更改。通常情况下,只有在每个SQL语句之后,MySQL才会写入对磁盘的所有更改,并让操作系统处理与磁盘的同步。参见第B.5.3.3节“如果MySQL保持崩溃怎么办”。ON如果使用该选项启动
mysqld,则
将此变量设置为--flush。
如果flush启用,则值flush_time无关紧要,并且更改为
flush_time对刷新行为没有影响。
| 属性 | 值 |
|---|---|
| 命令行格式 | --flush-time=# |
| 系统变量 | flush_time |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(Windows) | 整数 |
| 类型 | 整数 |
| 默认(Windows) | 0 |
| 默认 | 0 |
| 最小(Windows) | 0 |
| 最低限度 | 0 |
如果将其设置为非零值,则每秒关闭所有表
flush_time以释放资源并将未刷新的数据同步到磁盘。此选项最适用于资源最少的系统。
如果flush启用,则值flush_time无关紧要,并且更改为
flush_time对刷新行为没有影响。
| 属性 | 值 |
|---|---|
| 系统变量 | foreign_key_checks |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | 1 |
如果设置为1(缺省值),InnoDB则检查表的外键约束
。如果设置为0,则会忽略外键约束,但有一些例外情况。重新创建已删除的表时,如果表定义不符合引用该表的外键约束,则会返回错误。同样,ALTER TABLE如果外键定义不正确,则操作会返回错误。有关更多信息,请参见
第13.1.18.6节“使用FOREIGN KEY约束”。
设置此变量对NDB表格具有与对表格
相同的效果
InnoDB。通常,您在正常操作期间保持启用此设置,以强制执行
参照完整性。禁用外键检查对于InnoDB按照与其父/子关系所需顺序不同的顺序重新装载表可能很有用。请参见
第14.8.1.6节“InnoDB和FOREIGN KEY约束”。
设置foreign_key_checks为0还会影响数据定义语句:
DROP
SCHEMA即使它包含具有由模式外的表引用的外键的表,也会DROP TABLE
丢弃该模式,并丢弃具有由其他表引用的外键的表。
设置foreign_key_checks为1不会触发对现有表格数据的扫描。因此,添加到表中的
foreign_key_checks=0行将不会进行一致性验证。
从MySQL 5.7.5开始,不允许删除外键约束所需的索引,即使使用
foreign_key_checks=0。删除索引之前必须删除外键约束(错误#70260)。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ft-boolean-syntax=name |
| 系统变量 | ft_boolean_syntax |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | + -><()~*:""&| |
通过布尔全文搜索执行的运算符列表IN BOOLEAN MODE。请参见
第12.9.2节“布尔全文搜索”。
默认变量值是
'+ -><()~*:""&|'。更改值的规则如下所示:
操作员功能由字符串中的位置决定。
替换值必须是14个字符。
每个字符必须是ASCII非字母数字字符。
第一个或第二个字符必须是空格。
除了第11和第12位的引用操作符的短语外,不允许有重复。这两个字符不要求是相同的,但它们是唯一可能的两个。
位置10,13,和14(在缺省情况下被设定为
:,&和
|)被保留用于未来的扩展。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ft-max-word-len=# |
| 系统变量 | ft_max_word_len |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 最低限度 | 10 |
要包含在MyISAM FULLTEXT索引中的单词的最大长度
。
FULLTEXTMyISAM在更改此变量后,必须重建表上的索引
。使用。
REPAIR TABLE
tbl_name QUICK
| 属性 | 值 |
|---|---|
| 命令行格式 | --ft-min-word-len=# |
| 系统变量 | ft_min_word_len |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 4 |
| 最低限度 | 1 |
要包含在MyISAM FULLTEXT索引中的单词的最小长度
。
FULLTEXTMyISAM在更改此变量后,必须重建表上的索引
。使用。
REPAIR TABLE
tbl_name QUICK
| 属性 | 值 |
|---|---|
| 命令行格式 | --ft-query-expansion-limit=# |
| 系统变量 | ft_query_expansion_limit |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 20 |
| 最低限度 | 0 |
| 最大 | 1000 |
用于执行全文搜索的最高匹配数WITH QUERY EXPANSION。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ft-stopword-file=file_name |
| 系统变量 | ft_stopword_file |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
从中读取MyISAM表格上全文搜索的停用词表的文件。服务器在数据目录中查找文件,除非给出绝对路径名来指定不同的目录。文件中的所有单词都被使用; 评论
不荣幸。默认情况下,使用内置的停用词表(如storage/myisam/ft_static.c文件中所定义的
)。将此变量设置为空字符串('')将禁用停用词过滤。另请参见
第12.9.4节“全文停用词”。
FULLTEXTMyISAM在更改此变量或停用词文件的内容后,必须重建表上的索引
。使用。
REPAIR TABLE
tbl_name QUICK
| 属性 | 值 |
|---|---|
| 命令行格式 | --general-log |
| 系统变量 | general_log |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
是否启用一般查询日志。该值可以是0(或OFF)以禁用日志或1(或
ON)以启用日志。默认值取决于是否
--general_log给出选项。日志输出的目的地由log_output系统变量控制
; 如果该值是NONE,即使启用日志,也不会写入日志条目。
| 属性 | 值 |
|---|---|
| 命令行格式 | --general-log-file=file_name |
| 系统变量 | general_log_file |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 文件名 |
| 默认 | host_name.log |
一般查询日志文件的名称。默认值是
,但可以使用该host_name.log--general_log_file选项更改初始值
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --group-concat-max-len=# |
| 系统变量 | group_concat_max_len |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 1024 |
| 默认(32位平台) | 1024 |
| 最低(64位平台) | 4 |
| 最低(32位平台) | 4 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
GROUP_CONCAT()函数
的最大允许结果长度(以字节为单位)
。默认值是1024。
YES如果zlib
压缩库可用于服务器,NO则不可用
。如果不是,
则不能使用COMPRESS()和
UNCOMPRESS()功能。
YES如果crypt()
系统调用对服务器可用,NO
则不然。如果不是,ENCRYPT()
则不能使用该功能。
该ENCRYPT()函数从MySQL 5.7.6开始不推荐使用,将在未来的MySQL版本中删除,不应再使用。(对于单向散列,请考虑使用
SHA2()。)因此,have_crypt
也被弃用并将被删除。
YES如果mysqld支持动态加载插件,NO则不支持。如果值是NO,则不能使用诸如--plugin-load在服务器启动时加载插件的选项,或者INSTALL
PLUGIN在运行时加载插件的语句。
YES如果服务器支持空间数据类型,NO则不支持。
这个变量是一个别名
have_ssl。
YES如果语句分析功能存在,NO如果不存在。如果存在,则
profiling系统变量控制此功能是启用还是禁用。请参见
第13.7.5.31节“SHOW PROFILES语法”。
此变量已弃用,将在未来的MySQL版本中删除。
YES如果mysqld支持查询缓存,NO则不支持。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
have_query_cache。
YES如果RTREE索引可用,NO则不可用。(这些用于MyISAM表格中的空间索引。)
YES如果mysqld支持SSL连接,NO则不支持。
DISABLED表示该服务器是使用SSL支持编译的,但未使用适当的选项启动
。有关更多信息,请参见
第6.4.5节“构建支持加密连接的MySQL”。
--ssl-xxx
| 属性 | 值 |
|---|---|
| 介绍 | 5.7.4 |
| 系统变量 | have_statement_timeout |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 布尔 |
语句执行超时功能是否可用(请参阅语句执行时间优化程序提示)。NO如果此功能使用的后台线程无法初始化,则值可能为。
YES如果启用符号链接支持,NO则不支持
。这在Unix上是必需的,用于支持DATA DIRECTORY和
INDEX DIRECTORY表格选项。如果服务器使用该--skip-symbolic-links
选项启动
,则值为DISABLED。
这个变量在Windows上没有意义。
| 属性 | 值 |
|---|---|
| 系统变量 | host_cache_size |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | -1 (autosized) |
| 最低限度 | 0 |
| 最大 | 65536 |
内部主机缓存的大小(请参见
第8.12.5.2节“DNS查找优化和主机缓存”)。将大小设置为0将禁用主机缓存。在运行时更改高速缓存大小隐式导致FLUSH HOSTS操作清除主机高速缓存并截断
host_cache表。
默认值为128,对于max_connections高达500 的值,加上1,对于值为
20的每增加500,加上1,
max_connections限制为2000。
使用--skip-host-cache类似于将host_cache_size系统变量设置
为0,但
host_cache_size更灵活,因为它也可用于在运行时调整,启用或禁用主机缓存,而不仅仅是在服务器启动时。
如果启动服务器时
--skip-host-cache,不会阻止对其值进行
host_cache_size更改,但此类更改不起作用,即使host_cache_size设置为大于0 ,缓存也不会重新启用
。
| 属性 | 值 |
|---|---|
| 系统变量 | hostname |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
服务器在启动时将此变量设置为服务器主机名。
这个变量是变量的同义词
last_insert_id。它存在与其他数据库系统的兼容性。你可以用它来读取它的值SELECT @@identity,并使用它进行设置SET identity。
| 属性 | 值 |
|---|---|
| 弃用 | 16年7月5日 |
| 系统变量 | ignore_db_dirs |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
数据目录中不被视为数据库目录的名称的逗号分隔列表。该值是从--ignore-db-dir服务器启动时给定的任何实例设置的
。
从MySQL 5.7.11开始,
--ignore-db-dir可以在数据目录初始化时使用mysqld --initialize来指定服务器应忽略的目录,以评估现有数据目录是否被视为空。请参见
第2.10.1.1节“使用mysqld手动初始化数据目录”。
这个系统变量在MySQL 5.7中被弃用。随着MySQL 8.0中的数据字典的引入,它变得多余,并在该版本中被删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --init-connect=name |
| 系统变量 | init_connect |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 串 |
服务器为每个连接的客户端执行的字符串。该字符串由一个或多个SQL语句组成,用分号字符分隔。例如,默认情况下每个客户端会话都启用自动提交模式。对于较旧的服务器(在MySQL 5.5.8之前),没有全局
autocommit系统变量指定默认情况下应禁用自动提交,但作为解决方法init_connect可用于实现相同的效果:
SET GLOBAL init_connect ='SET autocommit = 0';
的init_connect变量也可以在命令行上或在选项文件设定。要使用选项文件设置刚才显示的变量,请包括以下几行:
的[mysqld] init_connect ='SET autocommit = 0'
对于有SUPER
权限的用户,内容
init_connect不被执行。这样做是为了避免错误的值
init_connect阻止所有客户端连接。例如,该值可能包含语法错误的语句,从而导致客户端连接失败。如果不init_connect具有该SUPER权限的用户执行此
操作,则可以让他们打开连接并修复该
init_connect值。
从MySQL 5.7.22开始,
init_connect任何具有过期密码的客户端用户都会跳过执行。这样做是因为这样的用户不能执行任意语句,因此init_connect
执行将失败,导致客户端无法连接。跳过init_connect
执行使用户可以连接和更改密码。
服务器放弃由of的值生成的任何结果集init_connect。
| 属性 | 值 |
|---|---|
| 命令行格式 | --init-file=file_name |
| 系统变量 | init_file |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
--init-file在启动服务器时
使用该选项指定的文件的名称
。这应该是一个包含希望服务器在启动时执行的SQL语句的文件。每条声明必须在一行中,不应包含注释。有关更多信息,请参阅说明
--init-file。
innodb_
xxx
InnoDB第14.14节“InnoDB启动选项和系统变量”列出了系统变量。这些变量控制表的存储,内存使用和I / O模式的许多方面,InnoDB现在它InnoDB是默认存储引擎,这一点尤为重要。
插入值时
以下
INSERT或
ALTER TABLE语句使用的AUTO_INCREMENT值。这主要与二进制日志一起使用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --interactive-timeout=# |
| 系统变量 | interactive_timeout |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 28800 |
| 最低限度 | 1 |
服务器在关闭之前等待交互式连接上的活动的秒数。交互式客户端被定义为使用该CLIENT_INTERACTIVE选项
的客户端
mysql_real_connect()。另见
wait_timeout。
internal_tmp_disk_storage_engine
| 属性 | 值 |
|---|---|
| 命令行格式 | --internal-tmp-disk-storage-engine=# |
| 介绍 | 5.7.5 |
| 系统变量 | internal_tmp_disk_storage_engine |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认(> = 5.7.6) | INNODB |
| 默认(<= 5.7.5) | MYISAM |
| 有效值 |
|
磁盘内部临时表的存储引擎(请参见
第8.4.4节“MySQL中的内部临时表”)。允许的值是MYISAM和INNODB
(默认值)。
这个系统变量是在MySQL 5.7.5中添加的,默认值为MYISAM。在MySQL 5.7.6中,默认值更改为INNODB。通过这一更改,优化器InnoDB默认
将存储引擎用于磁盘内部临时表。
使用
internal_tmp_disk_storage_engine=INNODB
(缺省值)时,生成超出InnoDB
行限制或列限制的磁盘内部临时表的查询
将返回行大小过大或列错误过多。解决方法是设置
internal_tmp_disk_storage_engine
为MYISAM。
| 属性 | 值 |
|---|---|
| 命令行格式 | --join-buffer-size=# |
| 系统变量 | join_buffer_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(其他,64位平台) | 整数 |
| 类型(其他32位平台) | 整数 |
| 类型(Windows) | 整数 |
| 默认(其他,64位平台) | 262144 |
| 默认(其他32位平台) | 262144 |
| 默认(Windows) | 262144 |
| 最小(其他64位平台) | 128 |
| 最小(其他32位平台) | 128 |
| 最小(Windows) | 128 |
| 最大(其他64位平台) | 18446744073709547520 |
| 最大(其他32位平台) | 4294967295 |
| 最大(Windows) | 4294967295 |
用于普通索引扫描,范围索引扫描和不使用索引并因此执行全表扫描的连接的最小缓冲区大小。通常,获得快速连接的最佳方式是添加索引。join_buffer_size当添加索引不可能时,增加值
以获得更快的全连接。为两个表之间的每个完全连接分配一个连接缓冲区。对于不使用索引的多个表之间的复杂连接,可能需要多个连接缓冲区。
除非使用批处理密钥访问(BKA),否则将缓冲区设置为大于保存每个匹配行所需的缓冲区并无益处,并且所有连接都至少分配了最小大小,因此请谨慎将此变量设置为全局值较大的值。最好将全局设置保持较小,并且只能在进行大型连接的会话中更改为更大的设置。如果全局大小大于大多数使用它的查询所需的大小,则内存分配时间可能导致性能下降。
当使用BKA时,值
join_buffer_size定义了每次向存储引擎发出请求时密钥批次的大小。缓冲区越大,对连接操作的右手边表的顺序访问就越多,这可以显着提高性能。
默认值是256KB。最大允许设置为
join_buffer_size4GB-1。64位平台允许使用较大的值(64位Windows除外,其中较大的值被截断为4GB-1,并带有警告)。
有关连接缓冲的更多信息,请参见 第8.2.1.6节“嵌套循环连接算法”。有关批处理键访问的信息,请参见 第8.2.1.11节“块嵌套循环和批处理键访问连接”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --keep-files-on-create=# |
| 系统变量 | keep_files_on_create |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
如果MyISAM没有DATA DIRECTORY选项创建表
,则该
.MYD文件将在数据库目录中创建。默认情况下,如果在这种情况下MyISAM找到现有.MYD文件,它将覆盖它。这同样适用于.MYI
没有INDEX
DIRECTORY选项创建的表的文件。要抑制此行为,请将该keep_files_on_create变量设置
为ON(1),在这种情况下,
MyISAM不会覆盖现有文件,而是返回错误。默认值是
OFF(0)。
如果MyISAM使用DATA DIRECTORYor INDEX
DIRECTORY选项创建表
并找到现有
.MYD或.MYI文件,MyISAM将始终返回错误。它不会覆盖指定目录中的文件。
| 属性 | 值 |
|---|---|
| 命令行格式 | --key-buffer-size=# |
| 系统变量 | key_buffer_size |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 8388608 |
| 默认(32位平台) | 8388608 |
| 最低(64位平台) | 8 |
| 最低(32位平台) | 8 |
| 最大(64位平台) | OS_PER_PROCESS_LIMIT |
| 最大(32位平台) | 4294967295 |
MyISAM表的
索引块被缓冲并由所有线程共享。
key_buffer_size是用于索引块的缓冲区的大小。密钥缓冲区也称为密钥缓存。
key_buffer_size32位平台上
的最大允许设置为
4GB-1。64位平台允许使用较大的值。有效的最大尺寸可能会更小,这取决于您的操作系统或硬件平台提供的可用物理RAM和每个进程的RAM限制。该变量的值表示请求的内存量。在内部,服务器分配的内存尽可能多,但实际的分配可能更少。
您可以增加值以获得更好的所有读取和多次写入的索引处理; 在一个主要功能是运行MySQL的系统上
MyISAM存储引擎中,机器总内存的25%是该变量的可接受值。但是,您应该意识到,如果使值太大(例如,超过机器总内存的50%),系统可能会开始分页并变得非常慢。这是因为MySQL依靠操作系统为数据读取执行文件系统缓存,因此您必须为文件系统缓存留出一些空间。您还应该考虑除了您可能使用的任何其他存储引擎的内存要求
MyISAM。
为了在同时写入多行时获得更高的速度,请使用LOCK TABLES。请参见
第8.2.4.1节“优化INSERT语句”。
您可以通过发出检查键值缓冲区的性能
SHOW STATUS声明和检查
Key_read_requests,
Key_reads,
Key_write_requests,和
Key_writes状态变量。(请参见第13.7.5节“SHOW语法”)。
Key_reads/Key_read_requests比例通常应小于0.01。Key_writes/Key_write_requests如果您主要使用更新和删除,则该比率通常接近1,但如果您倾向于执行同时影响许多行的更新或者如果使用DELAY_KEY_WRITE表格选项,则该
比率通常会更小
。
可以使用key_buffer_size结合
Key_blocks_unused状态变量和缓冲区块大小(可从key_cache_block_size
系统变量中获得)来确定正在使用的关键缓冲区部分
:
1 - ((Key_blocks_unused * key_cache_block_size)/ key_buffer_size)
此值是一个近似值,因为密钥缓冲区中的某些空间是在内部为管理结构分配的。影响这些结构开销的因素包括块大小和指针大小。随着块大小的增加,丢失关键缓冲区的百分比往往会降低。较大的块导致读取操作的数量较少(因为每次读取获得更多的密钥),但是相反,未检查的密钥读取的增加(如果不是块中的所有密钥都与查询有关)。
可以创建多个MyISAM
键缓存。4GB的大小限制分别适用于每个缓存,而不是作为一个组。请参见
第8.10.2节“MyISAM密钥缓存”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --key-cache-age-threshold=# |
| 系统变量 | key_cache_age_threshold |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 300 |
| 默认(32位平台) | 300 |
| 最低(64位平台) | 100 |
| 最低(32位平台) | 100 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
该值控制缓存从热键子列表中的热键子列表降级到热子列表。较低的值会导致降级更快发生。最小值为100.默认值为300.请参见第8.10.2节“MyISAM密钥缓存”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --key-cache-block-size=# |
| 系统变量 | key_cache_block_size |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 1024 |
| 最低限度 | 512 |
| 最大 | 16384 |
密钥缓存中块的大小(以字节为单位)。默认值为1024.请参见第8.10.2节“MyISAM密钥缓存”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --key-cache-division-limit=# |
| 系统变量 | key_cache_division_limit |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 100 |
| 最低限度 | 1 |
| 最大 | 100 |
密钥缓存缓冲区列表的热门和热门子列表之间的划分点。该值是用于暖子列表的缓冲区列表的百分比。允许值范围从1到100.默认值为100.请参见 第8.10.2节“MyISAM密钥缓存”。
| 属性 | 值 |
|---|---|
| 系统变量 | large_files_support |
| 范围 | 全球 |
| 动态 | 没有 |
是否使用大文件支持选项编译mysqld。
| 属性 | 值 |
|---|---|
| 命令行格式 | --large-pages |
| 系统变量 | large_pages |
| 范围 | 全球 |
| 动态 | 没有 |
| 平台特定 | Linux的 |
| 类型(Linux) | 布尔 |
| 默认(Linux) | FALSE |
是否启用大页面支持(通过
--large-pages选项)。请参见
第8.12.4.2节“启用大页面支持”。
| 属性 | 值 |
|---|---|
| 系统变量 | large_page_size |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型(Linux) | 整数 |
| 默认(Linux) | 0 |
如果启用大页面支持,则会显示内存页面的大小。大内存页面仅在Linux上受支持; 在其他平台上,此变量的值始终为0.请参见第8.12.4.2节“启用大页面支持”。
要从中返回的值
LAST_INSERT_ID()。当您LAST_INSERT_ID()在用于更新表的语句中使用时,它将存储在二进制日志
中。设置此变量不会更新mysql_insert_id()C API函数返回的值
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --lc-messages=name |
| 系统变量 | lc_messages |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | en_US |
用于错误消息的语言环境。默认是
en_US。服务器将参数转换为语言名称,并将其与值组合
lc_messages_dir以生成错误消息文件的位置。请参见
第10.11节“设置错误消息语言”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --lc-messages-dir=dir_name |
| 系统变量 | lc_messages_dir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
错误消息所在的目录。服务器使用该值和值
lc_messages来生成错误消息文件的位置。请参见
第10.11节“设置错误消息语言”。
| 属性 | 值 |
|---|---|
| 系统变量 | lc_time_names |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
此变量指定控制用于显示日期和月份名称和缩写的语言的区域设置。此变量影响从输出
DATE_FORMAT(),
DAYNAME()和
MONTHNAME()功能。区域设置名称是POSIX样式的值,例如
'ja_JP'或'pt_BR'。默认值'en_US'与系统的区域设置无关。有关更多信息,请参见
第10.15节“MySQL服务器区域设置支持”。
| 属性 | 值 |
|---|---|
| 系统变量 | license |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
| 默认 | GPL |
服务器拥有的许可证类型。
| 属性 | 值 |
|---|---|
| 系统变量 | local_infile |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | ON |
该变量控制
语句的服务器端LOCAL
功能LOAD DATA。根据
local_infile设置,服务器拒绝或允许客户端加载本地数据LOCAL在客户端启用。
要明确导致服务器拒绝或允许
LOAD DATA
LOCAL语句(不论如何客户程序和库在构建时或运行时配置),启动
mysqld的与
local_infile分别禁用或启用。
local_infile也可以在运行时设置。有关更多信息,请参见
第6.1.6节“LOAD DATA LOCAL的安全问题”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --lock-wait-timeout=# |
| 系统变量 | lock_wait_timeout |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 31536000 |
| 最低限度 | 1 |
| 最大 | 31536000 |
此变量指定尝试获取元数据锁定的超时时间(以秒为单位)。允许值范围从1到31536000(1年)。默认值是31536000。
此超时适用于所有使用元数据锁定的语句。这些措施包括在表上的DML和DDL操作,视图,存储过程和存储功能,以及
LOCK TABLES,
FLUSH TABLES WITH READ LOCK和HANDLER语句。
此超时不适用于对mysql数据库中的系统表的隐式访问,如修改的授权表GRANT或
REVOKE语句或表日志记录语句。超时确实适用于直接访问的系统表,例如with
SELECT或
UPDATE。
超时值分别适用于每个元数据锁定尝试。给定的语句可能需要多个锁,因此语句lock_wait_timeout在报告超时错误之前可能会阻塞的时间超过该
值。发生锁定超时时,
ER_LOCK_WAIT_TIMEOUT会报告。
lock_wait_timeout不适用于延迟插入,它总是以1年的超时执行。这样做是为了避免不必要的超时,因为发布延迟插入的会话不会收到延迟插入超时的通知。
| 属性 | 值 |
|---|---|
| 系统变量 | locked_in_memory |
| 范围 | 全球 |
| 动态 | 没有 |
log_backward_compatible_user_definitions
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-backward-compatible-user-definitions[={OFF|ON}] |
| 介绍 | 5.7.6 |
| 删除 | 5.7.9 |
| 系统变量 | log_backward_compatible_user_definitions |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
是否记录的
user_specification一部分
CREATE USER,
ALTER USER和
GRANT在向后兼容(5.7.6预)时尚的语句:
默认情况下,该变量被禁用。服务器将用户规格写为
。
user IDENTIFIED WITH
auth_plugin AS
'hash_string'
启用时,服务器将用户规格写为
。启用此变量可确保为跨版本复制提供更好的兼容性。
user IDENTIFIED BY
PASSWORD
'hash_string'
这个变量在MySQL 5.7.9中被删除,并被替换为
log_builtin_as_identified_by_password。
log_bin_trust_function_creators
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-bin-trust-function-creators |
| 系统变量 | log_bin_trust_function_creators |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | FALSE |
当启用二进制日志记录时,此变量适用。它控制是否可以信任存储的函数创建者不创建存储的函数,这些函数会将不安全的事件写入二进制日志。如果设置为0(默认值),则不允许用户创建或更改存储的功能,除非他们具有除SUPER权限CREATE
ROUTINE或ALTER
ROUTINE特权以外的特权。设置为0还强制了必须用该
特性声明函数的限制
。如果变量设置为1,则MySQL不会对存储函数的创建实施这些限制。这个变量也适用于触发器创建。看到
DETERMINISTIC特性,或与
READS SQL DATA或NO SQL第23.7节“存储程序的二进制记录”。
log_builtin_as_identified_by_password
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-builtin-as-identified-by-password[={OFF|ON}] |
| 介绍 | 5.7.9 |
| 系统变量 | log_builtin_as_identified_by_password |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
该变量影响用户管理语句的二进制日志记录。如果启用,CREATE USER包含内置认证插件的语句的二进制日志记录会
重写语句以包含IDENTIFIED BY
PASSWORD子句,SET
PASSWORD语句会记录为
SET PASSWORD语句,而不是被重写为ALTER
USER语句。
这个变量是在MySQL 5.7.9中添加的。它取代了
log_backward_compatible_user_definitions
变量。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-error[=file_name] |
| 系统变量 | log_error |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
错误日志输出目标。如果目标是控制台,则值为stderr。否则,目标是一个文件,
log_error值是文件名。请参见第5.4.2节“错误日志”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-error-verbosity=# |
| 介绍 | 5.7.2 |
| 系统变量 | log_error_verbosity |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 3 |
| 最低限度 | 1 |
| 最大 | 3 |
服务器在向错误日志中写入错误,警告和注释消息时的详细程度。下表显示了允许的值。默认值是3。
| 期望的日志过滤 | log_error_verbosity值 |
|---|---|
| 错误消息 | 1 |
| 错误和警告消息 | 2 |
| 错误,警告和注释消息 | 3 |
log_error_verbosity被添加到MySQL 5.7.2。它优先于,并且应该用来代替旧的
log_warnings系统变量。有关该log_warnings变量如何与之相关的信息,
请参阅说明
log_error_verbosity。特别是,分配一个值来
log_warnings分配一个值,log_error_verbosity反之亦然。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-output=name |
| 系统变量 | log_output |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 组 |
| 默认 | FILE |
| 有效值 |
|
一般查询日志和慢速查询日志输出的目的地。该值可以是一个或多个单词TABLE(记录到表格),
FILE(记录到文件)或
NONE(不记录到表格或文件)的以逗号分隔的列表。默认值是FILE。
NONE如果存在的话,优先于任何其他说明符。如果该值是NONE即使日志已启用也不写入日志条目。如果未启用日志,不记录即使价值发生
log_output不
NONE。有关更多信息,请参见
第5.4.1节“选择常规查询和慢速查询日志输出目标”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-queries-not-using-indexes |
| 系统变量 | log_queries_not_using_indexes |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
是否将不使用索引的查询记录到慢速查询日志中。请参见第5.4.5节“慢速查询日志”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-syslog[={0|1}] |
| 介绍 | 5.7.5 |
| 系统变量 | log_syslog |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(Windows) | 布尔 |
| 类型(Unix) | 布尔 |
| 默认(Windows) | ON |
| 默认(Unix) | OFF |
是否将错误日志输出写入系统日志。这是Windows syslog上的事件日志,以及Unix和类Unix系统上的事件日志。默认值是平台特定的:
在Windows上,默认情况下启用事件日志输出。
在Unix和类Unix系统上,syslog
默认情况下,输出处于禁用状态。
无论默认情况如何,
log_syslog都可以显式设置以控制任何支持的平台上的输出。
系统日志输出控制不同于将错误输出发送到文件或控制台。错误输出可以定向到除文件或控制台以外的系统日志或根据需要替代系统日志。请参见第5.4.2节“错误日志”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-syslog-facility=value |
| 介绍 | 5.7.5 |
| 系统变量 | log_syslog_facility |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | daemon |
将错误日志输出设备写入
syslog(发送消息的是哪种类型的程序)。除非log_syslog启用系统变量,否则此变量不起作用
。请参见第5.4.2节“错误日志”。
每个操作系统允许的值可能会有所不同; 请参阅您的系统syslog文档。
这个变量在Windows上不存在。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-syslog-include-pid[={0|1}] |
| 介绍 | 5.7.5 |
| 系统变量 | log_syslog_include_pid |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | ON |
是否将服务器进程ID包含在每行写入的错误日志输出中syslog。除非log_syslog启用系统变量,否则此变量不起作用
。请参见第5.4.2节“错误日志”。
这个变量在Windows上不存在。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-syslog-tag=value |
| 介绍 | 5.7.5 |
| 系统变量 | log_syslog_tag |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | empty string |
要将标记添加到错误日志输出中的服务器标识中写入syslog。除非log_syslog启用系统变量,否则此变量不起作用
。请参见第5.4.2节“错误日志”。
默认情况下,服务器标识符mysqld
没有标签。如果tag_val指定了标签,则将其附加到带有前导连字符的服务器标识符,从而生成标识符
。
mysqld-tag_val
在Windows上,要使用尚不存在的标签,服务器必须从具有管理员权限的帐户运行,以允许为标签创建注册表项。如果标签已经存在,则不需要提升权限。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-timestamps=# |
| 介绍 | 5.7.2 |
| 系统变量 | log_timestamps |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | UTC |
| 有效值 |
|
此变量控制写入错误日志的消息中的时间戳的时区,以及写入文件的一般查询日志和慢速查询日志消息。它不会影响写入表(mysql.general_log,
mysql.slow_log)的常规查询日志和慢速查询日志消息的时区。CONVERT_TZ()通过设置会话time_zone系统变量,从这些表中检索的行可以从本地系统时区转换为任何所需的时区
。
允许的log_timestamps
值是UTC(默认)和
SYSTEM(本地系统时区)。
时间戳使用ISO 8601 / RFC 3339格式编写:
YYYY-MM-DDThh:mm:ss.uuuuuu加上Z表示祖鲁时间(UTC)或±hh:mm(与UTC的偏移量)
的尾部值。
这个变量是在MySQL 5.7.2中添加的。在5.7.2之前,日志消息中的时间戳是默认使用本地系统时区编写的,而不是UTC。如果您希望先前的日志消息时区缺省设置
log_timestamps=SYSTEM。
log_throttle_queries_not_using_indexes
| 属性 | 值 |
|---|---|
| 系统变量 | log_throttle_queries_not_using_indexes |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
如果
log_queries_not_using_indexes
启用,该
log_throttle_queries_not_using_indexes
变量会限制每分钟可写入慢查询日志的此类查询的数量。值为0(默认值)表示“ 无限制 ”。有关更多信息,请参见
第5.4.5节“慢速查询日志”。
| 属性 | 值 |
|---|---|
| 介绍 | 5.7.1 |
| 系统变量 | log_slow_admin_statements |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
在写入慢查询日志的语句中包含慢管理语句。行政陈述包括ALTER TABLE,
ANALYZE TABLE,
CHECK TABLE,
CREATE INDEX,
DROP INDEX,
OPTIMIZE TABLE,和
REPAIR TABLE。
| 属性 | 值 |
|---|---|
| 命令行格式 | --log-warnings[=#] |
| 弃用 | 5.7.2 |
| 系统变量 | log_warnings |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台,> = 5.7.2) | 2 |
| 默认(64位平台,<= 5.7.1) | 1 |
| 默认(32位平台,> = 5.7.2) | 2 |
| 默认(32位平台,<= 5.7.1) | 1 |
| 最低(64位平台) | 0 |
| 最低(32位平台) | 0 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
是否向错误日志生成额外的警告消息。从MySQL 5.7.2的,先前所管辖的信息项log_warnings均受log_error_verbosity,这是优选的过,并且应该被用来代替,较老的
log_warnings系统变量。(log_warnings系统变量和--log-warnings
命令行选项已弃用,将在未来的MySQL版本中删除。)
log_warnings默认启用(MySQL 5.7.2之前默认为1,5.7.2之前为2)。要禁用它,请将其设置为0.如果该值大于0,则服务器将记录有关用于基于语句的日志记录不安全的语句的消息。如果该值大于1,则服务器将记录中止连接和访问被拒绝的错误以尝试新的连接。参见
第B.5.2.10节“通信错误和中止的连接”。
如果使用复制,建议将此变量设置为大于0来启用此功能,以获取有关发生的更多信息,例如有关网络故障和重新连接的消息。
如果从服务器启动时
log_warnings启用,从站将消息打印到错误日志中以提供有关其状态的信息,例如二进制日志和中继日志坐标,它在何处开始其作业,何时切换到另一个中继日志,何时断开连接后重新连接等等。
分配一个值来
log_warnings分配一个值,log_error_verbosity反之亦然。变量相关如下:
用
(仅用于错误)实现了
对所有log_warnings项目的
抑制
。
log_warnings=0log_error_verbosity=1
打印
log_warnings=1或更高版本的项目计为警告并打印
log_error_verbosity=2或更高版本。
打印的项目
log_warnings=2计为笔记并打印
log_error_verbosity=3。
从MySQL 5.7.2开始,默认日志级别由
log_error_verbosity默认值3控制。此外,默认log_warnings值为1到2,对应于
默认值
log_error_verbosity=3。要达到类似于以前的默认值的日志记录级别,请设置
log_error_verbosity=2。
在MySQL 5.7.2及更高版本中,
log_warnings仍然允许使用,但使用log_error_verbosity如下映射
:
设置log_warnings=0等同于
log_error_verbosity=1
(仅限错误)。
设置log_warnings=1等同于
log_error_verbosity=2
(错误,警告)。
设置log_warnings=2
(或更高)等同于
log_error_verbosity=3
(错误,警告,注释),并且log_warnings如果指定较大的值,则服务器设置
为2。
| 属性 | 值 |
|---|---|
| 命令行格式 | --long-query-time=# |
| 系统变量 | long_query_time |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 数字 |
| 默认 | 10 |
| 最低限度 | 0 |
如果查询花费的时间超过了这么多秒,服务器会增加Slow_queries
状态变量。如果启用了慢速查询日志,则会将查询记录到慢速查询日志文件中。该值是实时测量的,而不是CPU时间,因此在负载较轻的系统上,阈值以下的查询可能会高于阈值。最小值和默认值分别long_query_time为0和10。该值可以指定为微秒的分辨率。对于记录到文件,写入时间包括微秒部分。对于记录到表中,只写入整数次; 微秒部分被忽略。请参见第5.4.5节“慢速查询日志”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --low-priority-updates |
| 系统变量 | low_priority_updates |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | FALSE |
如果设置为1所有
INSERT,
UPDATE,
DELETE和LOCK TABLE
WRITE语句等到有没有挂起
SELECT或LOCK TABLE
READ受影响的表。这会影响只使用表级锁只存储引擎(例如
MyISAM,MEMORY和
MERGE)。
| 属性 | 值 |
|---|---|
| 系统变量 | lower_case_file_system |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 布尔 |
此变量描述数据目录所在文件系统上文件名的区分大小写。
OFF意味着文件名称区分大小写,
ON意味着它们不区分大小写。此变量是只读的,因为它反映了文件系统属性并将其设置为对文件系统没有影响。
| 属性 | 值 |
|---|---|
| 命令行格式 | --lower-case-table-names[=#] |
| 系统变量 | lower_case_table_names |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 2 |
如果设置为0,表格名称按指定进行存储,并且比较区分大小写。如果设置为1,表名将以小写形式存储在磁盘上,并且比较不区分大小写。如果设置为2,则表名按照给定值存储,但以小写字母进行比较。该选项也适用于数据库名称和表别名。有关更多信息,请参见 第9.2.2节“标识符大小写敏感性”。
在Windows上,默认值为1.在OS X上,默认值为2。
你应该不设置
lower_case_table_names,如果你所在的数据目录驻留在不区分大小写的文件系统(如Windows或OS X)的系统上运行MySQL为0。这是一个不受支持的组合,当运行
错误的
字母大小写操作时可能导致挂起状况。随着,使用不同的字母大小写访问表名可能会导致索引损坏。
INSERT INTO ...
SELECT ... FROM tbl_nametbl_nameMyISAM
从MySQL 5.7.9开始,打印一条错误消息,如果尝试--lower_case_table_names=0在不区分大小写的文件系统上启动服务器,则服务器将退出
。
如果您使用InnoDB表格,则应在所有平台上将此变量设置为1以强制名称转换为小写字母。
MySQL 5.7中该变量的设置会影响复制过滤选项在区分大小写方面的行为。(缺陷号51639)有关更多信息,请参见 第16.2.5节“服务器如何评估复制过滤规则”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-allowed-packet=# |
| 系统变量 | max_allowed_packet |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 4194304 |
| 最低限度 | 1024 |
| 最大 | 1073741824 |
一个数据包或任何生成/中间字符串的最大大小,或mysql_stmt_send_long_data()C API函数发送的任何参数
。默认值是4MB。
数据包消息缓冲区初始化为
net_buffer_length字节,但max_allowed_packet在需要时可增长到
字节。这个值默认是很小的,以捕获大量的(可能不正确的)数据包。
如果您使用大BLOB列或长字符串,则必须增加此值
。它应该和BLOB你想要使用的最大一样大
。协议限制为
max_allowed_packet1GB。该值应该是1024的倍数; nonmultiples向下舍入到最接近的倍数。
当通过更改max_allowed_packet
变量的值更改消息缓冲区大小时,如果客户端程序允许,还应该更改客户端的缓冲区大小。max_allowed_packet内置于客户端库的默认
值为1GB,但单个客户端程序可能会覆盖此值。例如,
mysql和mysqldump的默认值分别为16MB和24MB。它们还使您能够通过max_allowed_packet在命令行或选项文件中进行设置来更改客户端值
。
此变量的会话值是只读的。客户端可以接收最多与会话值相同的字节数。但是,服务器不会向当前全局max_allowed_packet值发送更多的字节给客户端
。(如果全局值在客户端连接后更改,则全局值可能小于会话值。)
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-connect-errors=# |
| 系统变量 | max_connect_errors |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 100 |
| 默认(32位平台) | 100 |
| 最低(64位平台) | 1 |
| 最低(32位平台) | 1 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
如果超过这个数量,来自主机的多个连续连接请求在没有成功连接的情况下被中断,则服务器阻止主机进一步连接。您可以通过刷新主机缓存来取消阻止阻止的主机。为此,请发出FLUSH HOSTS语句或执行mysqladmin flush-hosts
命令。如果max_connect_errors
在先前连接中断后的尝试次数少于尝试次数的情况下成功建立连接,则主机的错误计数将清除为零。但是,一旦主机被阻止,刷新主机缓存是解除阻止的唯一方法。默认值是100。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-connections=# |
| 系统变量 | max_connections |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 151 |
| 最低限度 | 1 |
| 最大 | 100000 |
同时进行的客户端连接的最大允许数量。默认情况下,这是151.有关更多信息,请参见 第B.5.2.6节“连接太多”。
增加此值会增加mysqld所需的文件描述符的数量。如果所需数量的描述符不可用,则服务器将减少值max_connections。有关文件描述符限制的注释,请参见第8.4.3.1节“MySQL如何打开和关闭表”。
mysqld实际上允许
max_connections+1
客户端连接。额外的连接被保留以供具有该SUPER
特权的帐户使用。通过SUPER向管理员授予
权限而不授予普通用户(他们不需要它),管理员可以连接到服务器并用于
SHOW PROCESSLIST诊断问题,即使连接了未授权的最大数量的客户端也是如此。请参见第13.7.5.29节“SHOW PROCESSLIST语法”。
连接被拒绝,因为
max_connections已达到限制增加
Connection_errors_max_connections
状态变量。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-delayed-threads=# |
| 弃用 | 是 |
| 系统变量 | max_delayed_threads |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 20 |
| 最低限度 | 0 |
| 最大 | 16384 |
此系统变量已被弃用(因为
DELAYED不支持插入),并将在未来版本中删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-digest-length=# |
| 介绍 | 5.7.6 |
| 系统变量 | max_digest_length |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 1024 |
| 最低限度 | 0 |
| 最大 | 1048576 |
可用于计算标准化语句摘要的最大字节数。一旦在摘要计算过程中使用了大量空间,就会发生截断:不会收集来自解析语句的其他令牌,也不会收集其摘要值。仅在解析令牌的许多字节产生相同的规范化语句摘要之后才会有区别的语句,并且如果进行比较或汇总为摘要统计信息,则认为它们是相同的。
减少
max_digest_length值会减少内存使用,但会导致更多语句的摘要值如果仅在最后才有区别,则无法区分。增加该值允许区分较长的语句,但会增加内存使用量,尤其是对于涉及大量同时会话(服务器max_digest_length为每个会话分配字节数)的工作负载
。
解析器使用此系统变量作为它计算的规范化语句摘要的最大长度的限制。性能模式,如果它跟踪语句摘要,则使用“ performance_schema_max_digest_length。” 作为摘要值的副本
。系统变量作为它存储的摘要的最大长度的限制。因此,如果performance_schema_max_digest_length
小于
,则
max_digest_length存储在性能模式中的摘要值将相对于原始摘要值被截断。
有关语句摘要的更多信息,请参见 第25.9节“性能模式语句摘要”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-error-count=# |
| 系统变量 | max_error_count |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 64 |
| 最低限度 | 0 |
| 最大 | 65535 |
由SHOW
ERRORSand SHOW
WARNINGS语句显示的错误,警告和注释消息的最大数量。这与诊断区域中的条件区域数量相同,因此也是可以通过检查的条件数量
GET DIAGNOSTICS。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-execution-time=# |
| 介绍 | 5.7.8 |
| 系统变量 | max_execution_time |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
SELECT语句
的执行超时
,以毫秒为单位。如果该值为0,则超时未启用。
max_execution_time 适用如下:
全局
max_execution_time值为新连接提供会话值的默认值。会话值适用
SELECT于在会话中执行的不包含
优化器提示或其
值为0的执行。
MAX_EXECUTION_TIME(N)N
max_execution_time
适用于只读SELECT
语句。不是只读的语句是那些调用一个存储函数,将数据修改为副作用的语句。
max_execution_time对于SELECT
存储程序中的语句将被忽略。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-heap-table-size=# |
| 系统变量 | max_heap_table_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 16777216 |
| 默认(32位平台) | 16777216 |
| 最低(64位平台) | 16384 |
| 最低(32位平台) | 16384 |
| 最大(64位平台) | 1844674407370954752 |
| 最大(32位平台) | 4294967295 |
该变量设置用户创建的MEMORY表允许增长的最大大小
。该变量的值用于计算
MEMORY表MAX_ROWS
值。设置此变量对任何现有的无影响
MEMORY的表,除非表是用一份声明中重新创建如
CREATE TABLE或结构改变
ALTER TABLE或
TRUNCATE TABLE。服务器重新启动还会将现有MEMORY表的最大大小设置
为全局
max_heap_table_size值。
此变量也可用于
tmp_table_size限制内部内存表的大小。请参见
第8.4.4节“MySQL中的内部临时表使用”。
max_heap_table_size不被复制。有关更多信息,请参见
第16.4.1.20节“复制和存储器表”和
第16.4.1.38节“复制和变量”。
| 属性 | 值 |
|---|---|
| 弃用 | 是 |
| 系统变量 | max_insert_delayed_threads |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
这个变量是一个同义词
max_delayed_threads。
此系统变量已被弃用(因为
DELAYED不支持插入),并将在未来版本中删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-join-size=# |
| 系统变量 | max_join_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 18446744073709551615 |
| 最低限度 | 1 |
| 最大 | 18446744073709551615 |
不要允许可能需要检查多max_join_size行(对于单表语句)或行组合(对于多表语句)或可能比max_join_size磁盘搜索更多的语句
。通过设置这个值,你可以捕捉那些密钥使用不当的情况,这可能需要很长时间。如果用户倾向于执行缺少WHERE子句的联接,
需要很长时间或返回数百万行,请将其设置。
这个变量设置为以外的值
DEFAULT重置价值
sql_big_selects来
0。如果sql_big_selects再次设置该
值,该max_join_size变量将被忽略。
如果查询缓存中存在查询结果,则不会执行结果大小检查,因为结果先前已计算过,并且不会给服务器发送它到客户端造成负担。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-length-for-sort-data=# |
| 系统变量 | max_length_for_sort_data |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 1024 |
| 最低限度 | 4 |
| 最大 | 8388608 |
决定filesort使用哪种算法的索引值大小的截止值
。请参见
第8.2.1.13节“按优化排序”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-points-in-geometry=integer |
| 介绍 | 5.7.8 |
| 系统变量 | max_points_in_geometry |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 65536 |
| 最低限度 | 3 |
| 最大 | 1048576 |
函数points_per_circle参数
的最大值
ST_Buffer_Strategy()。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-prepared-stmt-count=# |
| 系统变量 | max_prepared_stmt_count |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 16382 |
| 最低限度 | 0 |
| 最大 | 1048576 |
该变量限制了服务器中预备语句的总数。它可以用于有可能发生拒绝服务攻击的环境,这些攻击是基于通过准备大量语句来运行服务器而导致内存不足。如果该值设置为低于当前准备好的语句数量,则现有语句不受影响并可以使用,但只有当前数字低于限制时才能准备新语句。默认值是16,382。值的允许范围是从0到100万。将该值设置为0将禁用预准备语句。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-relay-log-size=# |
| 系统变量 | max_relay_log_size |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 1073741824 |
如果复制从站写入其中继日志会导致当前日志文件大小超过此变量的值,则从站将转动中继日志(关闭当前文件并打开下一个文件)。如果
max_relay_log_size为0,则服务器同时使用max_binlog_size
二进制日志和中继日志。如果
max_relay_log_size大于0,则会限制中继日志的大小,这使您可以为两个日志设置不同的大小。您必须将其设置
max_relay_log_size为4096字节和1GB(含)之间,或者设置为0.默认值为0.请参见第16.2.2节“复制实施详细信息”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-seeks-for-key=# |
| 系统变量 | max_seeks_for_key |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 18446744073709551615 |
| 默认(32位平台) | 4294967295 |
| 最低(64位平台) | 1 |
| 最低(32位平台) | 1 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
根据密钥查找行时限制假定的最大搜索数量。MySQL优化器假定,通过扫描索引来搜索表中的匹配行时,不管索引的实际基数如何,都不需要超过这个数量的关键索引(请参见 第13.7.5.22节“SHOW INDEX语法”)。通过将其设置为较低的值(比如100),可以强制MySQL优先使用索引而不是表扫描。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-sort-length=# |
| 系统变量 | max_sort_length |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 1024 |
| 最低限度 | 4 |
| 最大 | 8388608 |
排序数据值时使用的字节数。服务器只使用max_sort_length每个值的第一个
字节并忽略其余的值。因此,仅第一后不同的值
max_sort_length的字节相比较如相等GROUP BY,ORDER
BY和DISTINCT操作。
增加价值
max_sort_length可能需要增加价值
sort_buffer_size。有关详细信息,请参见第8.2.1.13节“按优化排序”
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-sp-recursion-depth[=#] |
| 系统变量 | max_sp_recursion_depth |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
| 最大 | 255 |
可以递归调用任何给定存储过程的次数。此选项的默认值为0,这将完全禁用存储过程中的递归。最大值是255。
存储过程递归增加了对线程堆栈空间的需求。如果增加值
max_sp_recursion_depth,可能需要通过增加thread_stack服务器启动时的值来增加线程堆栈大小。
| 属性 | 值 |
|---|---|
| 介绍 | 5.7.4 |
| 删除 | 5.7.8 |
| 系统变量 | max_statement_time |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
这个变量是在MySQL 5.7.4中添加的,并且被重命名为
max_execution_timeMySQL 5.7.8。
这个变量未被使用。它已被弃用,并在MySQL 8.0中被删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-user-connections=# |
| 系统变量 | max_user_connections |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 4294967295 |
允许任何给定的MySQL用户帐户同时连接的最大数量。值为0(默认值)表示 “ 没有限制。”
该变量具有可在服务器启动或运行时设置的全局值。它还具有只读会话值,该值指示适用于与当前会话关联的帐户的有效同时连接限制。会话值初始化如下:
如果用户帐户具有非零
MAX_USER_CONNECTIONS资源限制,则会话
max_user_connections
值设置为该限制。
否则,会话
max_user_connections
值被设置为全局值。
帐户资源限制是使用CREATE USERor
ALTER USER语句指定的
。请参见
第6.3.5节“设置帐户资源限制”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --max-write-lock-count=# |
| 系统变量 | max_write_lock_count |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 18446744073709551615 |
| 默认(32位平台) | 4294967295 |
| 最低(64位平台) | 1 |
| 最低(32位平台) | 1 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
在这么多的写入锁之后,允许一些挂起的读取锁定请求在两者之间进行处理。
| 属性 | 值 |
|---|---|
| 命令行格式 | --mecab-rc-file |
| 介绍 | 5.7.6 |
| 系统变量 | mecab_rc_file |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
该mecab_rc_file选项用于设置MeCab全文分析器。
该mecab_rc_file选项定义mecabrc配置文件的路径,该文件是MeCab的配置文件。该选项是只读的,只能在启动时进行设置。该
mecabrc配置文件需要初始化仲裁处。
有关MeCab全文分析器的信息,请参阅 第12.9.9节“MeCab全文分析器插件”。
有关可在MeCab mecabrc配置文件中指定的选项的信息,请参阅
Google Developers站点上的
MeCab文档。
| 属性 | 值 |
|---|---|
| 弃用 | 5.7.4 |
| 系统变量 | metadata_locks_cache_size |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 1024 |
| 最低限度 | 1 |
| 最大 | 1048576 |
元数据的大小锁定缓存。服务器使用此缓存来避免创建和销毁同步对象。这对于那些操作昂贵的系统特别有用,例如Windows XP。
在MySQL 5.7.4中,元数据锁定实现的变化使得这个变量变得不必要,所以它被弃用,并且将在未来的MySQL版本中被删除。
| 属性 | 值 |
|---|---|
| 弃用 | 5.7.4 |
| 系统变量 | metadata_locks_hash_instances |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 8 |
| 最低限度 | 1 |
| 最大 | 1024 |
这组元数据锁可以分成不同的散列值,以允许连接访问不同的对象以使用不同的锁定散列并减少争用。所述
metadata_locks_hash_instances
系统变量指定散列的(缺省为8)的数目。
在MySQL 5.7.4中,元数据锁定实现的变化使得这个变量变得不必要,所以它被弃用,并且将在未来的MySQL版本中被删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --min-examined-row-limit=# |
| 系统变量 | min_examined_row_limit |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 0 |
| 默认(32位平台) | 0 |
| 最低(64位平台) | 0 |
| 最低(32位平台) | 0 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
检查少于此行数的查询不会记录到慢速查询日志中。
| 属性 | 值 |
|---|---|
| 命令行格式 | --multi-range-count=# |
| 弃用 | 是 |
| 系统变量 | multi_range_count |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 256 |
| 最低限度 | 1 |
| 最大 | 4294967295 |
这个变量没有效果。它已被弃用,并在MySQL 8.0中被删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --myisam-data-pointer-size=# |
| 系统变量 | myisam_data_pointer_size |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 6 |
| 最低限度 | 2 |
| 最大 | 7 |
以字节为单位的默认指针大小,通过使用
CREATE TABLE用于
MyISAM表没有当
MAX_ROWS指定选项。该变量不能小于2或大于7.缺省值是6.请参见第B.5.2.11节“表已满”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --myisam-max-sort-file-size=# |
| 系统变量 | myisam_max_sort_file_size |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 9223372036854775807 |
| 默认(32位平台) | 2147483648 |
MySQL正在允许而重新创建一个使用临时文件的最大尺寸MyISAM指数(期间REPAIR TABLE,
ALTER TABLE或
LOAD DATA
INFILE)。如果文件大小大于此值,则索引是使用键缓存创建的,而速度较慢。该值以字节为单位给出。
如果MyISAM索引文件超过此大小并且磁盘空间可用,则增加该值可能有助于提高性能。该空间必须在包含原始索引文件所在目录的文件系统中可用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --myisam-mmap-size=# |
| 系统变量 | myisam_mmap_size |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 18446744073709551615 |
| 默认(32位平台) | 4294967295 |
| 最低(64位平台) | 7 |
| 最低(32位平台) | 7 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
用于内存映射压缩MyISAM文件的最大内存量。如果使用许多压缩MyISAM表,则可以降低该值以减少存储器交换问题的可能性。
| 属性 | 值 |
|---|---|
| 系统变量 | myisam_recover_options |
| 范围 | 全球 |
| 动态 | 没有 |
--myisam-recover-options
选项
的值
。请参见第5.1.4节“服务器命令选项”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --myisam-repair-threads=# |
| 系统变量 | myisam_repair_threads |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 1 |
| 默认(32位平台) | 1 |
| 最低(64位平台) | 1 |
| 最低(32位平台) | 1 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
如果此值大于1,MyISAM
则在此Repair by sorting
过程中并行创建表索引(每个索引在其自己的线程中)。默认值是1。
多线程修复仍然是 beta质量代码。
| 属性 | 值 |
|---|---|
| 命令行格式 | --myisam-sort-buffer-size=# |
| 系统变量 | myisam_sort_buffer_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(其他,64位平台) | 整数 |
| 类型(其他32位平台) | 整数 |
| 类型(Windows,64位平台) | 整数 |
| 类型(Windows,32位平台) | 整数 |
| 默认(其他,64位平台) | 8388608 |
| 默认(其他32位平台) | 8388608 |
| 默认(Windows,64位平台) | 8388608 |
| 默认(Windows,32位平台) | 8388608 |
| 最小(其他64位平台) | 4096 |
| 最小(其他32位平台) | 4096 |
| 最低(Windows,64位平台) | 4096 |
| 最低(Windows,32位平台) | 4096 |
| 最大(其他64位平台) | 18446744073709551615 |
| 最大(其他32位平台) | 4294967295 |
| 最大(Windows,64位平台) | 18446744073709551615 |
| 最大(Windows,32位平台) | 4294967295 |
排序时被分配的缓冲区的大小
MyISAM一期间索引
REPAIR TABLE与创建索引时或CREATE INDEX或
ALTER TABLE。
最大允许设置为
myisam_sort_buffer_size4GB-1。64位平台允许使用较大的值。
| 属性 | 值 |
|---|---|
| 命令行格式 | --myisam-stats-method=name |
| 系统变量 | myisam_stats_method |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | nulls_unequal |
| 有效值 |
|
NULL在收集有关MyISAM表格索引值分布的统计信息时
,服务器如何处理值。这个变量有三个可能的值nulls_equal,
nulls_unequal和
nulls_ignored。因为
nulls_equal,所有的NULL
索引值都被认为是相等的,并且形成一个大小等于NULL值数量的单个值组
。因为
nulls_unequal,NULL
值被认为是不相等的,并且每个
NULL值形成一个大小为1的不同值组。因此nulls_ignored,
NULL值被忽略。
用于生成表统计信息的方法会影响优化程序如何为查询执行选择索引,如第8.3.7节“InnoDB和MyISAM索引统计信息收集”中所述。
| 属性 | 值 |
|---|---|
| 命令行格式 | --myisam-use-mmap |
| 系统变量 | myisam_use_mmap |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
使用内存映射来读取和写入
MyISAM表格。
mysql_native_password_proxy_users
| 属性 | 值 |
|---|---|
| 命令行格式 | --mysql-native-password-proxy-users=[={OFF|ON}] |
| 介绍 | 5.7.7 |
| 系统变量 | mysql_native_password_proxy_users |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
该变量控制mysql_native_password内置身份验证插件是否
支持代理用户。除非check_proxy_users
启用系统变量,否则它不起作用。有关用户代理的信息,请参见第6.3.10节“代理用户”。
这个变量是在MySQL 5.7.7中添加的。在5.7.7之前,
mysql_native_password不支持代理用户。
| 属性 | 值 |
|---|---|
| 系统变量 | named_pipe |
| 范围 | 全球 |
| 动态 | 没有 |
| 平台特定 | 视窗 |
| 类型(Windows) | 布尔 |
| 默认(Windows) | OFF |
(仅限Windows)指示服务器是否支持通过命名管道进行连接。
| 属性 | 值 |
|---|---|
| 命令行格式 | --net-buffer-length=# |
| 系统变量 | net_buffer_length |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 16384 |
| 最低限度 | 1024 |
| 最大 | 1048576 |
每个客户端线程都与连接缓冲区和结果缓冲区关联。两者都以给定的大小开始,
net_buffer_length但max_allowed_packet根据需要动态放大到
字节。结果缓冲区缩小到
net_buffer_length每个SQL语句之后。
这个变量通常不应该改变,但是如果你的内存很少,你可以将它设置为客户端发送的预期的语句长度。如果语句超出此长度,连接缓冲区会自动放大。net_buffer_length可以设置的最大值
是1MB。
此变量的会话值是只读的。
| 属性 | 值 |
|---|---|
| 命令行格式 | --net-read-timeout=# |
| 系统变量 | net_read_timeout |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 30 |
| 最低限度 | 1 |
在中止读取之前等待来自连接的更多数据的秒数。当服务器从客户端读取net_read_timeout时,控制何时中止的超时值。当服务器正在写入客户端时,
net_write_timeout控制何时中止的超时值。另见
slave_net_timeout。
| 属性 | 值 |
|---|---|
| 命令行格式 | --net-retry-count=# |
| 系统变量 | net_retry_count |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 10 |
| 默认(32位平台) | 10 |
| 最低(64位平台) | 1 |
| 最低(32位平台) | 1 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
如果通信端口的读取或写入中断,请在放弃之前多次重试。这个值应该在FreeBSD上设置得相当高,因为内部中断被发送到所有线程。
| 属性 | 值 |
|---|---|
| 命令行格式 | --net-write-timeout=# |
| 系统变量 | net_write_timeout |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 60 |
| 最低限度 | 1 |
在中止写入之前等待块写入连接的秒数。另见
net_read_timeout。
| 属性 | 值 |
|---|---|
| 命令行格式 | --new |
| 系统变量 | new |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 被禁用 | skip-new |
| 类型 | 布尔 |
| 默认 | FALSE |
这个变量在MySQL 4.0中用于打开一些4.1行为,并保留为了向后兼容。它的价值永远是OFF。
在NDB簇,设置此变量ON
使得能够使用比其他分区类型
KEY或LINEAR KEY与
NDB表。此功能仅用于实验,并且在生产中不受支持。有关其他信息,请参阅
用户定义的分区和NDB存储引擎(NDB集群)。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ngram-token-size |
| 介绍 | 5.7.6 |
| 系统变量 | ngram_token_size |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 2 |
| 最低限度 | 1 |
| 最大 | 10 |
定义n-gram全文分析器的n-gram标记大小。该ngram_token_size选项是只读的,只能在启动时修改。默认值是2(bigram)。最大值是10。
有关如何配置此变量的更多信息,请参见 第12.9.8节“ngram全文分析器”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --offline-mode=val |
| 介绍 | 5.7.5 |
| 系统变量 | offline_mode |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
服务器是否处于“ 离线模式 ”,其具有以下特征:
只有拥有该SUPER
权限的用户才能控制离线模式。要使服务器处于离线模式,请将offline_mode系统变量的值
从OFF更改为ON。要恢复正常操作,请offline_mode从中
更改
ON为OFF。在脱机模式下,拒绝访问的客户端会收到
ER_SERVER_OFFLINE_MODE错误消息。
| 属性 | 值 |
|---|---|
| 命令行格式 | --old |
| 系统变量 | old |
| 范围 | 全球 |
| 动态 | 没有 |
old是一个兼容性变量。它在默认情况下处于禁用状态,但可以在启动时启用,以将服务器恢复到旧版本中的行为。
当old启用时,它改变索引提示到之前的MySQL 5.1.17使用的默认范围。也就是说,没有FOR子句的索引提示
仅适用于索引如何用于行检索而不用于解析ORDER
BY或GROUP BY子句。(请参见
第8.9.4节“索引提示”。)注意在复制设置中启用此功能。使用基于语句的二进制日志记录时,主服务器和从服务器使用不同的模式可能会导致复制错误。
| 属性 | 值 |
|---|---|
| 命令行格式 | --old-alter-table |
| 系统变量 | old_alter_table |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
当启用此变量时,服务器不会使用处理ALTER
TABLE操作的优化方法。它恢复为使用临时表,复制数据,然后将临时表重新命名为原始表,正如MySQL 5.0及更早版本所使用的那样。有关操作的更多信息
ALTER TABLE,请参见
第13.1.8节“ALTER TABLE语法”。
| 属性 | 值 |
|---|---|
| 弃用 | 5.7.6 |
| 系统变量 | old_passwords |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | 0 |
| 有效值(> = 5.7.5) |
|
| 有效值(<= 5.7.4) |
|
这个系统变量从MySQL 5.7.6开始不推荐使用,并且将在未来的MySQL版本中被删除。
该变量控制函数使用的密码哈希方法
PASSWORD()。它还影响由执行的密码散列
CREATE USER和
GRANT使用IDENTIFIED BY子句指定密码的语句。
下表显示了对于每种密码散列方法,允许的值old_passwords以及哪些验证插件使用散列方法。
| 密码散列法 | old_passwords值 | 关联的身份验证插件 |
|---|---|---|
| MySQL 4.1本机散列 | 0 | mysql_native_password |
| SHA-256哈希 | 2 | sha256_password |
如果设置了old_passwords=2,请按照第6.5.1.4节“SHA-256可插入验证”中关于使用sha256_password插件
的说明进行操作
。
服务器old_passwords在启动期间将全局值设置为
与default_authentication_plugin
系统变量指示的身份验证插件所需的密码散列方法一致
。
当客户端成功连接到服务器时,服务器会old_passwords为帐户认证方法适当地设置会话
值。例如,如果帐户使用
sha256_password认证插件,则服务器设置old_passwords=2。
有关认证插件和散列格式的更多信息,请参见 第6.3.9节“可插入认证”和 第6.1.2.4节“MySQL中的密码散列”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --open-files-limit=# |
| 系统变量 | open_files_limit |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 5000, with possible adjustment |
| 最低限度 | 0 |
| 最大 | platform dependent |
操作系统允许mysqld打开的文件数量 。运行时此变量的值是系统允许的实际值,可能与您在服务器启动时指定的值不同。在MySQL无法更改打开文件数的系统上,该值为0。
有效
open_files_limit值是基于在系统启动时指定的值(如果有的话)和的值max_connections
和table_open_cache使用这些公式:
1)10 + max_connections +(table_open_cache * 2) 2)max_connections * 5 3)操作系统限制,如果是积极的 4)如果操作系统限制为无穷大: 在启动时指定的open_files_limit值,如果没有则为5000
服务器尝试使用这三个值中的最大值来获取文件描述符的数量。如果无法获取许多描述符,则服务器会尝试获取系统允许的数量。
| 属性 | 值 |
|---|---|
| 命令行格式 | --optimizer-prune-level[=#] |
| 系统变量 | optimizer_prune_level |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | 1 |
控制在查询优化期间应用的启发式方法,以从优化程序搜索空间中删减不太有前途的部分计划。值为0将禁用启发式,以便优化器执行彻底搜索。值为1将导致优化器根据中间计划检索的行数修剪计划。
| 属性 | 值 |
|---|---|
| 命令行格式 | --optimizer-search-depth[=#] |
| 系统变量 | optimizer_search_depth |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 62 |
| 最低限度 | 0 |
| 最大 | 62 |
查询优化器执行的最大搜索深度。大于查询中关系数目的值将导致更好的查询计划,但需要更长时间才能为查询生成执行计划。小于查询中关系数目的值会更快地返回执行计划,但生成的计划可能远不是最优的。如果设置为0,系统会自动选择一个合理的值。
| 属性 | 值 |
|---|---|
| 命令行格式 | --optimizer-switch=value |
| 系统变量 | optimizer_switch |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 组 |
| 有效值(> = 5.7.8) |
|
| 有效值(> = 5.7.6,<= 5.7.7) |
|
| 有效值(5.7.5) |
|
| 有效值(<= 5.7.4) |
|
该optimizer_switch系统变量能够在优化行为的控制。此变量的值是一组标志,每个标志都具有一个值
on或off指示相应的优化器行为是启用还是禁用。该变量具有全局和会话值,并且可以在运行时更改。全局默认值可以在服务器启动时设置。
要查看当前的优化器标志集,请选择变量值:
MySQL的> SELECT @@optimizer_switch\G
*************************** 1. row ******************** *******
@@ optimizer_switch:index_merge = on,index_merge_union = on,
index_merge_sort_union =开,
index_merge_intersection =开,
engine_condition_pushdown =开,
index_condition_pushdown =开,
MRR =开,上mrr_cost_based =,
block_nested_loop =开,batched_key_access =关,
物化=开,半连接=上,loosescan =开,
firstmatch =开,duplicateweedout =开,
subquery_materialization_cost_based =开,
use_index_extensions =开,
condition_fanout_filter =开,derived_merge =上
有关此变量的语法及其控制的优化程序行为的更多信息,请参见 第8.9.3节“可切换优化”。
| 属性 | 值 |
|---|---|
| 系统变量 | optimizer_trace |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
该变量控制优化器跟踪。有关详细信息,请参阅 MySQL内部:跟踪优化器。
| 属性 | 值 |
|---|---|
| 系统变量 | optimizer_trace_features |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
该变量启用或禁用选定的优化器跟踪功能。有关详细信息,请参阅 MySQL内部:跟踪优化器。
| 属性 | 值 |
|---|---|
| 系统变量 | optimizer_trace_limit |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 1 |
要显示的优化器轨迹的最大数量。有关详细信息,请参阅 MySQL内部:跟踪优化器。
| 属性 | 值 |
|---|---|
| 系统变量 | optimizer_trace_max_mem_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 16384 |
存储的优化器跟踪的最大累积大小。有关详细信息,请参阅 MySQL内部:跟踪优化器。
| 属性 | 值 |
|---|---|
| 系统变量 | optimizer_trace_offset |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | -1 |
优化器跟踪的偏移量显示。有关详细信息,请参阅 MySQL内部:跟踪优化器。
performance_schema_
xxx
性能模式系统变量在第25.14节“性能模式系统变量”中列出 。这些变量可用于配置性能模式操作。
| 属性 | 值 |
|---|---|
| 命令行格式 | --parser-max-mem-size=N |
| 介绍 | 5.7.12 |
| 系统变量 | parser_max_mem_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 18446744073709551615 |
| 默认(32位平台) | 4294967295 |
| 最低(64位平台) | 10000000 |
| 最低(32位平台) | 10000000 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
解析器可用的最大内存量。默认值对可用内存没有限制。可以减少该值以防止解析长或复杂的SQL语句导致的内存不足情况。
| 属性 | 值 |
|---|---|
| 命令行格式 | --pid-file=file_name |
| 系统变量 | pid_file |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
进程ID文件的路径名称。该变量可以通过该--pid-file选项进行设置。服务器在数据目录中创建文件,除非给出绝对路径名来指定不同的目录。如果您指定了该--pid-file
选项,则必须指定一个值。如果您不指定该
--pid-file
选项,则MySQL使用默认值
,其中host_name.pidhost_name是主机名称。
其他程序(如mysqld_safe)使用进程ID文件 来确定服务器的进程ID。在Windows上,该变量也会影响默认的错误日志文件名称。请参见第5.4.2节“错误日志”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --plugin-dir=dir_name |
| 系统变量 | plugin_dir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
| 默认 | BASEDIR/lib/plugin |
插件目录的路径名称。
如果插件目录可由服务器写入,则用户可以使用可执行代码写入目录中的文件SELECT
... INTO DUMPFILE。这可以通过plugin_dir只读服务器或通过设置
--secure-file-priv到SELECT可以安全写入的目录来防止
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --port=# |
| 系统变量 | port |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 3306 |
| 最低限度 | 0 |
| 最大 | 65535 |
服务器侦听TCP / IP连接的端口号。该变量可以通过该--port选项进行设置
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --preload-buffer-size=# |
| 系统变量 | preload_buffer_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 32768 |
| 最低限度 | 1024 |
| 最大 | 1073741824 |
预加载索引时分配的缓冲区的大小。
如果设置为0或OFF(缺省值),语句分析将被禁用。如果设置为1或者ON语句分析已启用,
SHOW PROFILE并且
SHOW PROFILES语句提供对分析信息的访问权限。请参见
第13.7.5.31节“SHOW PROFILES语法”。
此变量已弃用,将在未来的MySQL版本中删除。
如果profiling启用了维护分析信息的语句的数量。默认值是15.最大值是100.将值设置为0可以有效地禁用分析。请参见
第13.7.5.31节“SHOW PROFILES语法”。
此变量已弃用,将在未来的MySQL版本中删除。
| 属性 | 值 |
|---|---|
| 系统变量 | protocol_version |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
MySQL服务器使用的客户端/服务器协议的版本。
| 属性 | 值 |
|---|---|
| 系统变量 | proxy_user |
| 范围 | 会议 |
| 动态 | 没有 |
| 类型 | 串 |
如果当前客户端是另一个用户的代理,则此变量是代理用户帐户名称。否则,这个变量是NULL。参见
第6.3.10节“代理用户”。
| 属性 | 值 |
|---|---|
| 系统变量 | pseudo_slave_mode |
| 范围 | 会议 |
| 动态 | 是 |
| 类型 | 整数 |
此变量用于内部服务器使用。
| 属性 | 值 |
|---|---|
| 系统变量 | pseudo_thread_id |
| 范围 | 会议 |
| 动态 | 是 |
| 类型 | 整数 |
此变量用于内部服务器使用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --query-alloc-block-size=# |
| 系统变量 | query_alloc_block_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台,<= 5.7.8) | 整数 |
| 类型(32位平台,<= 5.7.8) | 整数 |
| 类型(> = 5.7.9) | 整数 |
| 默认(64位平台,<= 5.7.8) | 8192 |
| 默认(32位平台,<= 5.7.8) | 8192 |
| 默认(> = 5.7.9) | 8192 |
| 最小(64位平台,<= 5.7.8) | 1024 |
| 最小(32位平台,<= 5.7.8) | 1024 |
| 最小(> = 5.7.9) | 1024 |
| 最大(64位平台,<= 5.7.8) | 18446744073709551615 |
| 最大(32位平台,<= 5.7.8) | 4294967295 |
| 最大(> = 5.7.9) | 4294967295 |
| 块大小(64位平台,<= 5.7.8) | 1024 |
| 块大小(32位平台,<= 5.7.8) | 1024 |
| 块大小(> = 5.7.9) | 1024 |
为在语句分析和执行期间创建的对象分配的内存块的分配大小。如果您在内存碎片方面遇到问题,则可能有助于增加此参数。
| 属性 | 值 |
|---|---|
| 命令行格式 | --query-cache-limit=# |
| 弃用 | 20年7月5日 |
| 系统变量 | query_cache_limit |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 1048576 |
| 默认(32位平台) | 1048576 |
| 最低(64位平台) | 0 |
| 最低(32位平台) | 0 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
不要缓存大于此字节数的结果。默认值是1MB。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
query_cache_limit。
| 属性 | 值 |
|---|---|
| 命令行格式 | --query-cache-min-res-unit=# |
| 弃用 | 20年7月5日 |
| 系统变量 | query_cache_min_res_unit |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 4096 |
| 默认(32位平台) | 4096 |
| 最低(64位平台) | 512 |
| 最低(32位平台) | 512 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
查询缓存分配的块的最小大小(以字节为单位)。默认值是4096(4KB)。有关此变量的调整信息在 第8.10.3.3节“查询缓存配置”中给出。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
query_cache_min_res_unit。
| 属性 | 值 |
|---|---|
| 命令行格式 | --query-cache-size=# |
| 弃用 | 20年7月5日 |
| 系统变量 | query_cache_size |
| 范围 | 全球 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 1048576 |
| 默认(32位平台) | 1048576 |
| 最低(64位平台) | 0 |
| 最低(32位平台) | 0 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
分配用于缓存查询结果的内存量。默认情况下,查询缓存被禁用。这是通过使用默认值1M来实现的,默认值为
query_cache_type0.(如果将大小设置为0,则要显着降低开销,还应该使用启动服务器
query_cache_type=0。
允许的值是1024的倍数; 其他值向下舍入到最接近的倍数。对于非零值
query_cache_size,即使分配了很多字节的内存也是如此
query_cache_type=0。有关更多信息,请参见
第8.10.3.3节“查询缓存配置”。
查询缓存需要大约40KB的最小大小来分配其结构。(具体大小取决于系统架构。)如果设置的值
query_cache_size太小,将发生警告,如
第8.10.3.3节“查询缓存配置”中所述。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
query_cache_size。
| 属性 | 值 |
|---|---|
| 命令行格式 | --query-cache-type=# |
| 弃用 | 20年7月5日 |
| 系统变量 | query_cache_type |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | 0 |
| 有效值 |
|
设置查询缓存类型。设置
GLOBAL值可设置此后连接的所有客户端的类型。单个客户端可以设置该
SESSION值以影响他们自己使用查询缓存。下表显示了可能的值。
| 选项 | 描述 |
|---|---|
0 要么 OFF |
不要缓存结果或从查询缓存中检索结果。请注意,这不会释放查询缓存缓冲区。要做到这一点,你应该设置
query_cache_size为0。 |
1 要么 ON |
缓存所有可缓存的查询结果,除了那些开头的结果
SELECT SQL_NO_CACHE。 |
2 要么 DEMAND |
缓存结果仅适用于以缓存开头的查询SELECT
SQL_CACHE。 |
这个变量默认为OFF。
如果服务器启动时
query_cache_type设置为0,则它根本不会获取查询缓存互斥锁,这意味着查询缓存无法在运行时启用,并且查询执行的开销将减少。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
query_cache_type。
| 属性 | 值 |
|---|---|
| 命令行格式 | --query-cache-wlock-invalidate |
| 弃用 | 20年7月5日 |
| 系统变量 | query_cache_wlock_invalidate |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | FALSE |
通常,当一个客户端获得WRITE
对MyISAM表的锁定时,如果查询结果存在于查询缓存中,则其他客户端不会发出从该表读取的语句。将此变量设置为1会导致获取WRITE表的
锁定,以使查询缓存中引用该表的任何查询无效。这会强制其他尝试访问表的客户端在锁有效时等待。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
query_cache_wlock_invalidate。
| 属性 | 值 |
|---|---|
| 命令行格式 | --query-prealloc-size=# |
| 系统变量 | query_prealloc_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 8192 |
| 默认(32位平台) | 8192 |
| 最低(64位平台) | 8192 |
| 最低(32位平台) | 8192 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
| 块大小(64位平台) | 1024 |
| 块大小(32位平台) | 1024 |
用于语句解析和执行的持久缓冲区的大小。语句之间不会释放此缓冲区。如果您正在运行复杂的查询,则较大的
query_prealloc_size值可能有助于提高性能,因为它可以减少服务器在查询执行操作期间执行内存分配的需要。
该rand_seed1和
rand_seed2作为唯一的会话变量存在变数,并且可以设置,但不能读取。变量 - 但不是它们的值 - 显示在输出中SHOW VARIABLES。
这些变量的目的是支持RAND()函数的复制。对于调用的语句,RAND()主服务器将两个值传递给从服务器,它们用于为随机数生成器播种。从使用这些值来设置会话变量
rand_seed1和
rand_seed2以便
RAND()在从机产生相同的值上的主站。
请参阅说明
rand_seed1。
| 属性 | 值 |
|---|---|
| 命令行格式 | --range-alloc-block-size=# |
| 系统变量 | range_alloc_block_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台,> = 5.7.8) | 整数 |
| 类型(64位平台,<= 5.7.8) | 整数 |
| 类型(32位平台,<= 5.7.8) | 整数 |
| 类型(> = 5.7.9) | 整数 |
| 默认(64位平台,> = 5.7.8) | 4096 |
| 默认(64位平台,<= 5.7.8) | 4096 |
| 默认(32位平台,<= 5.7.8) | 4096 |
| 默认(> = 5.7.9) | 4096 |
| 最小(64位平台,> = 5.7.8) | 4096 |
| 最小(64位平台,<= 5.7.8) | 4096 |
| 最小(32位平台,<= 5.7.8) | 4096 |
| 最小(> = 5.7.9) | 4096 |
| 最大(64位平台,> = 5.7.8) | 18446744073709547520 |
| 最大(64位平台,<= 5.7.8) | 18446744073709551615 |
| 最大(32位平台,<= 5.7.8) | 4294967295 |
| 最大(> = 5.7.9) | 4294967295 |
| 块大小(64位平台,> = 5.7.8) | 1024 |
| 块大小(64位平台,<= 5.7.8) | 1024 |
| 块大小(32位平台,<= 5.7.8) | 1024 |
| 块大小(> = 5.7.9) | 1024 |
进行范围优化时分配的块的大小。
| 属性 | 值 |
|---|---|
| 命令行格式 | --range-optimizer-max-mem-size=N |
| 介绍 | 5.7.9 |
| 系统变量 | range_optimizer_max_mem_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认(> = 5.7.12) | 8388608 |
| 默认(<= 5.7.11) | 1536000 |
| 最低限度 | 0 |
| 最大 | 18446744073709551615 |
范围优化器的内存消耗限制。值为0意味着“ 没有限制。“如果优化器考虑的执行计划使用范围访问方法,但优化器估计此方法所需的内存量将超过限制,则会放弃计划并考虑其他计划。有关更多信息,请参阅 限制范围优化的内存使用。
| 属性 | 值 |
|---|---|
| 介绍 | 5.7.1 |
| 系统变量 | rbr_exec_mode |
| 范围 | 会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | STRICT |
| 有效值 |
|
这个变量在IDEMPOTENT模式和
STRICT模式之间切换服务器
。IDEMPOTENT
模式导致抑制重复密钥和未找到密钥错误。在服务器上重播基于行的二进制日志时,此模式非常有用,可能会与现有数据发生冲突。
通过将以下内容写入输出来设置选项时,mysqlbinlog使用此模式
--idempotent:
SET SESSION RBR_EXEC_MODE = IDEMPOTENT;
| 属性 | 值 |
|---|---|
| 命令行格式 | --read-buffer-size=# |
| 系统变量 | read_buffer_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 131072 |
| 最低限度 | 8200 |
| 最大 | 2147479552 |
对MyISAM表执行顺序扫描的每个线程都会为其扫描的每个
表分配一个此大小的缓冲区(以字节为单位)。如果您执行多次连续扫描,则可能需要增加此值,该值默认为131072.此变量的值应为4KB的倍数。如果设置的值不是4KB的倍数,则其值将舍入到4KB的最接近倍数。
对于所有存储引擎,此选项也用于以下上下文中:
用于在临时文件(而不是临时表)中缓存索引时,对行进行排序ORDER
BY。
用于批量插入分区。
用于缓存嵌套查询的结果。
以另一种存储引擎特定的方式:确定MEMORY
表的内存块大小。
最大允许设置为
read_buffer_size2GB。
有关不同操作期间内存使用的更多信息,请参见第8.12.4.1节“MySQL如何使用内存”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --read-only |
| 系统变量 | read_only |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
当read_only启用系统变量时,服务器将不允许客户端更新,但具有该SUPER特权的用户除外
。这个变量默认是禁用的。
从MySQL 5.7.8开始,服务器还支持一个
super_read_only系统变量(默认情况下禁用),具有以下效果:
如果super_read_only启用,服务器禁止客户端更新,即使是有SUPER
权限的用户也是如此。
设置super_read_only
于ON隐含强制
read_only到
ON。
设置read_only于
OFF隐含强制
super_read_only到
OFF。
即使read_only启用,服务器也允许这些操作:
如果服务器是复制从服务器,则由从线程执行更新。在复制设置中,read_only在从服务器上启用以确保从服务器只接受来自主服务器的更新而不接受来自客户端的更新。
使用ANALYZE TABLE或
OPTIMIZE TABLE陈述。只读模式的目的是防止更改表结构或内容。分析和优化不符合这种变化。这意味着,例如,可以使用mysqlcheck --all-databases --analyze执行对只读复制从服务器的一致性检查。
在TEMPORARY表上操作。
插入日志表(mysql.general_log和
mysql.slow_log); 请参见
第5.4.1节“选择常规查询和慢速查询日志输出目标”。
作为MySQL的16年5月7日的,更新为性能架构表,如UPDATE或
TRUNCATE TABLE操作。
read_only主服务器上的
更改不会复制到从服务器。该值可以在从服务器上进行设置,与主服务器上的设置无关。
以下条件适用于尝试启用read_only(包括启用
导致的隐式尝试
super_read_only):
尝试失败,如果您有任何明确的锁定(已获取LOCK
TABLES)或有未决的事务,则会发生错误。
尝试阻止其他客户端持有显式表锁或具有未决事务,直到锁被释放并且事务结束。虽然尝试启用处于read_only挂起状态,但其他客户端的表锁或开始事务的请求read_only在设置之前也会阻塞
。
尝试阻止是否存在保存元数据锁的活动事务,直到这些事务结束。
read_only可以在您持有全局读取锁定(随获取FLUSH TABLES WITH READ
LOCK)时启用,
因为它不涉及表格锁定。
| 属性 | 值 |
|---|---|
| 命令行格式 | --read-rnd-buffer-size=# |
| 系统变量 | read_rnd_buffer_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 262144 |
| 最低限度 | 1 |
| 最大 | 2147483647 |
此变量用于从MyISAM
表中读取数据,并且对于任何存储引擎,用于多范围读取优化。
当MyISAM按键排序操作按排序顺序读取表中的行时,通过此缓冲区读取行以避免磁盘搜索。请参见
第8.2.1.13节“按优化排序”。将变量设置为较大值可以大大提高ORDER BY
性能。但是,这是为每个客户端分配的缓冲区,因此您不应将全局变量设置为较大的值。相反,只需从需要运行大型查询的客户端中更改会话变量。
最大允许设置为
read_rnd_buffer_size2GB。
有关不同操作期间内存使用的更多信息,请参见第8.12.4.1节“MySQL如何使用内存”。有关多范围读取优化的信息,请参见 第8.2.1.10节“多范围读取优化”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --relay-log-purge |
| 系统变量 | relay_log_purge |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | TRUE |
一旦不再需要,立即禁用或启用自动清除中继日志文件。默认值是1(ON)。
| 属性 | 值 |
|---|---|
| 命令行格式 | --relay-log-space-limit=# |
| 系统变量 | relay_log_space_limit |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 0 |
| 默认(32位平台) | 0 |
| 最低(64位平台) | 0 |
| 最低(32位平台) | 0 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
用于所有中继日志的最大空间量。
| 属性 | 值 |
|---|---|
| 命令行格式 | --report-host=host_name |
| 系统变量 | report_host |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
--report-host
选项
的值。
| 属性 | 值 |
|---|---|
| 命令行格式 | --report-password=name |
| 系统变量 | report_password |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
--report-password选项
的值
。与用于MySQL复制用户帐户的密码不同。
| 属性 | 值 |
|---|---|
| 命令行格式 | --report-port=# |
| 系统变量 | report_port |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | [slave_port] |
| 最低限度 | 0 |
| 最大 | 65535 |
--report-port
选项
的值。
| 属性 | 值 |
|---|---|
| 命令行格式 | --report-user=name |
| 系统变量 | report_user |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
--report-user
选项
的值。与MySQL复制用户帐户的名称不同。
| 属性 | 值 |
|---|---|
| 命令行格式 | --require-secure-transport[={OFF|ON}] |
| 介绍 | 5.7.8 |
| 系统变量 | require_secure_transport |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
是否需要连接到服务器的客户端使用某种形式的安全传输。启用此变量时,服务器仅允许使用SSL的TCP / IP连接,或者使用套接字文件(在Unix上)或共享内存(在Windows上)的连接。服务器拒绝不安全的连接尝试,失败并出现
ER_SECURE_TRANSPORT_REQUIRED
错误。
此功能可补充每个帐户的SSL要求,这些要求优先考虑。例如,如果用户定义了帐户REQUIRE SSL,则启用
require_secure_transport不能使用该帐户使用Unix套接字文件进行连接。
服务器可能没有可用的安全传输。例如,Windows上的服务器如果在未指定任何SSL证书或密钥文件且shared_memory禁用系统变量的情况下启动,则不支持安全传输
。在这些情况下,尝试
require_secure_transport启动时会导致服务器将消息写入错误日志并退出。尝试在运行时启用该变量会失败并出现
ER_NO_SECURE_TRANSPORTS_CONFIGURED
错误。
| 属性 | 值 |
|---|---|
| 系统变量 | rpl_semi_sync_master_enabled |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
控制是否在主服务器上启用半同步复制。要启用或禁用插件,分别将此变量设置为
ON或OFF(或1或0)。默认是OFF。
只有安装了主端半同步复制插件时,此变量才可用。
| 属性 | 值 |
|---|---|
| 系统变量 | rpl_semi_sync_master_timeout |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 10000 |
以毫秒为单位的值,用于控制主服务器在超时并恢复异步复制之前等待来自从服务器的确认提交等待的时间。默认值是10000(10秒)。
只有安装了主端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_trace_level
| 属性 | 值 |
|---|---|
| 系统变量 | rpl_semi_sync_master_trace_level |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 32 |
主服务器上的半同步复制调试跟踪级别。定义四个级别:
1 =一般水平(例如时间函数失败)
16 =详细级别(更详细的信息)
32 =净等待级别(有关网络等待的更多信息)
64 =功能级别(关于功能进入和退出的信息)
只有安装了主端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_wait_for_slave_count
| 属性 | 值 |
|---|---|
| 介绍 | 5.7.3 |
| 系统变量 | rpl_semi_sync_master_wait_for_slave_count |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 1 |
| 最低限度 | 1 |
| 最大 | 65535 |
主机在进行处理之前必须接收的从属确认数量。缺省情况下
rpl_semi_sync_master_wait_for_slave_count
是1,这意味着接收一个从机确认之后半同步复制进行。对于这个变量的小值,性能最好。
例如,如果
rpl_semi_sync_master_wait_for_slave_count
是2,则2个从服务器必须在rpl_semi_sync_master_timeout
为进行半同步复制而配置的超时时间之前确认收到事务
。如果在超时期限内从站确认收到事务的次数较少,主站将恢复正常复制。
这种行为也依赖于
rpl_semi_sync_master_wait_no_slave
只有安装了主端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_wait_no_slave
| 属性 | 值 |
|---|---|
| 系统变量 | rpl_semi_sync_master_wait_no_slave |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | ON |
控制主站是否等待由rpl_semi_sync_master_timeout
过期配置的超时期限,即使从站计数降至小于超时期间配置
的从站数量
rpl_semi_sync_master_wait_for_slave_count
。
当的值
rpl_semi_sync_master_wait_no_slave是
ON(缺省值),用于从属计数下降到小于它是允许
rpl_semi_sync_master_wait_for_slave_count
在超时期限内。只要足够的从站在超时时间到期之前确认事务,半同步复制就会继续。
当的值
rpl_semi_sync_master_wait_no_slave是
OFF,如果从计数下降到小于配置在数
rpl_semi_sync_master_wait_for_slave_count
期间由配置的超时时间段在任何时候
rpl_semi_sync_master_timeout,主恢复到正常的复制。
只有安装了主端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_wait_point
| 属性 | 值 |
|---|---|
| 介绍 | 5.7.2 |
| 系统变量 | rpl_semi_sync_master_wait_point |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | AFTER_SYNC |
| 有效值 |
|
此变量控制在将状态返回给提交事务的客户端之前,半同步复制主服务器等待事务接收的从服务器确认的点。这些值是允许的:
AFTER_SYNC(缺省值):主服务器将每个事务写入其二进制日志和从服务器,并将二进制日志同步到磁盘。同步后,主设备等待从设备确认事务接收。在收到确认后,主服务器将事务提交给存储引擎,并将结果返回给客户端,然后客户端可以继续。
AFTER_COMMIT:主服务器将每个事务写入其二进制日志和从服务器,同步二进制日志,并将事务提交给存储引擎。主提交后等待从服务器确认事务接收。在收到确认后,主人将结果返回给客户端,然后客户端可以继续。
这些设置的复制特征不同,如下所示:
使用时AFTER_SYNC,所有客户端同时看到已提交的事务:在从服务器确认并承诺主服务器上的存储引擎之后。因此,所有客户端都会在主服务器上看到相同的数据。
在主站发生故障时,主站上提交的所有事务都已复制到从站(保存到其中继日志中)。由于从站是最新的,主站和故障转移到从站的崩溃是无损的。但是请注意,在这种情况下无法重新启动主服务器,并且必须将其丢弃,因为其二进制日志可能包含未提交的事务,这些事务在二进制日志恢复后进行外部化时会与从服务器发生冲突。
使用时AFTER_COMMIT,只有在服务器提交给存储引擎并接收到从应答之后,颁发该事务的客户才会获得返回状态。在提交之后和从属确认之前,其他客户端可以在提交客户端之前看到提交的事务。
如果出现错误,从服务器不处理事务,那么在主服务器崩溃并故障切换到从服务器的情况下,这些客户端可能会看到相对于他们在主服务器上看到的数据丢失。
只有安装了主端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_wait_point
被添加到MySQL 5.7.2。对于旧版本,半同步主节点行为等同于设置
AFTER_COMMIT。
此更改引入了版本兼容性约束,因为它增加了半同步接口版本:Servers for MySQL 5.7.2及更高版本不适用于旧版本的半同步复制插件,老版本的服务器也不适用于MySQL 5.7.2的半同步复制插件和。
| 属性 | 值 |
|---|---|
| 系统变量 | rpl_semi_sync_slave_enabled |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
控制是否在从站上启用半同步复制。要启用或禁用插件,分别将此变量设置为
ON或OFF(或1或0)。默认是OFF。
只有安装了从端半同步复制插件时,此变量才可用。
rpl_semi_sync_slave_trace_level
| 属性 | 值 |
|---|---|
| 系统变量 | rpl_semi_sync_slave_trace_level |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 32 |
从站上的半同步复制调试跟踪级别。请参阅
rpl_semi_sync_master_trace_level
允许值。
只有安装了从端半同步复制插件时,此变量才可用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --secure-auth |
| 弃用 | 5.7.5 |
| 系统变量 | secure_auth |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | ON |
| 有效值(> = 5.7.5) | ON |
| 有效值(<= 5.7.4) |
|
如果启用此变量,则服务器会阻止客户端尝试使用以旧(4.1之前)格式存储密码的帐户进行的连接。
启用此变量可防止使用旧格式的密码(并因此通过网络进行不安全的通信)。
此变量已弃用,将在未来的MySQL版本中删除。它始终启用并试图禁用它会产生错误。
如果启用了此变量并且特权表格处于4.1之前格式,则服务器启动将失败,并显示错误。请参见 第6.5.1.3节“从4.1之前的密码散列和mysql_old_password插件迁移”。
使用4.1以前的哈希方法的密码比使用本机密码散列方法并应避免的密码的安全性要低。4.1之前的密码已被弃用,并且在MySQL 5.7.5中删除了对它们的支持。有关帐户升级说明,请参见 第6.5.1.3节“从4.1之前的密码散列和mysql_old_password插件迁移”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --secure-file-priv=dir_name |
| 系统变量 | secure_file_priv |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
| 默认(> = 5.7.6) | platform specific |
| 默认(<= 5.7.5) | empty string |
| 有效值(> = 5.7.6) |
|
| 有效值(<= 5.7.5) |
|
这个变量用于限制数据导入和导出操作的效果,比如由LOAD DATAand和
SELECT ... INTO
OUTFILE语句和
LOAD_FILE()函数执行的操作
。这些操作只允许有FILE特权的用户使用
。
secure_file_priv 可以设置如下:
如果为空,则该变量不起作用。这不是一个安全的设置。
如果设置为目录名称,则服务器将导入和导出操作限制为仅对该目录中的文件起作用。目录必须存在; 服务器不会创建它。
如果设置为NULL,服务器将禁用导入和导出操作。MySQL 5.7.6允许使用该值。
默认值是平台特定的,取决于CMake选项的值,如下表所示。要从源代码构建,请明确指定默认
值,请使用
CMake选项。
INSTALL_LAYOUT
secure_file_privINSTALL_SECURE_FILE_PRIVDIR
INSTALL_LAYOUT 值 |
默认secure_file_priv值 |
|---|---|
STANDALONE, WIN |
NULL (> = MySQL 5.7.16),空(<MySQL 5.7.16) |
DEB,RPM,SLES,
SVR4 |
/var/lib/mysql-files |
| 除此以外 | mysql-files低于
CMAKE_INSTALL_PREFIX价值 |
从MySQL 5.7.8开始,为了设置嵌入式服务器的默认
secure_file_priv值libmysqld,使用
CMake选项。此选项的默认值是。
INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR
NULL
从MySQL 5.7.6开始,服务器将检查secure_file_priv启动时的值,
并在错误日志中写入警告(如果该值不安全)。如果非NULL值为空,或者值为数据目录或其子目录,或者所有用户都可访问的目录,则认为它是不安全的。如果secure_file_priv设置为不存在的路径,则服务器将错误消息写入错误日志并退出。
| 属性 | 值 |
|---|---|
| 命令行格式 | --server-id=# |
| 系统变量 | server_id |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 4294967295 |
服务器ID,在复制中用于为每个主服务器和从服务器提供唯一标识。该变量由--server-id选项设置
。对于参与复制的每个服务器,您应该从1到2 32 - 1 范围内选取一个正整数作为该服务器的ID。
| 属性 | 值 |
|---|---|
| 命令行格式 | --session-track-gtids=[value] |
| 介绍 | 5.7.6 |
| 系统变量 | session_track_gtids |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | OFF |
| 有效值 |
|
控制一个跟踪器来捕获GTID并将它们返回到OK数据包中。根据此选项的值,在执行事务结束时,指定的GTID由跟踪器捕获并附加到OK数据包。可追踪的GTID集包括:
OFF意味着没有GTID包含在OK数据包中。这与5.7.6之前版本的MySQL的行为相同。
OWN_GTID 配置跟踪器收集成功提交的读/写事务生成的GTID。
ALL_GTIDS配置跟踪器gtid_executed在当前事务提交时收集所有GTID
,而不管事务是读/写还是只读。
有关在客户端程序中获取会话状态更改信息的信息,请参见 第27.8.7.65节“mysql_session_track_get_first()”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --session-track-schema=# |
| 介绍 | 5.7.4 |
| 系统变量 | session_track_schema |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | ON |
控制服务器是否跟踪当前会话中对默认架构(数据库)名称的更改,并在发生更改时使此信息可供客户端使用。
如果启用了通知,即使新模式名称与旧模式名称相同,也会报告默认模式的任何设置。
有关在客户端程序中获取会话状态更改信息的信息,请参见 第27.8.7.65节“mysql_session_track_get_first()”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --session-track-state-change=# |
| 介绍 | 5.7.4 |
| 系统变量 | session_track_state_change |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
控制服务器是否跟踪当前会话状态的更改,并在发生状态更改时通知客户端。会话状态由以下值组成:
默认模式(数据库)
系统变量的会话特定值
用户定义的变量
临时表
准备好的陈述
如果启用会话状态跟踪器,则会报告会话状态值的任何分配,即使新值与旧值相同。
该
session_track_state_change
变量仅控制何时发生更改的通知,而不是控制更改。要接收更改默认模式名称和会话系统变量值的通知,请使用session_track_schema
和
session_track_system_variables
系统变量。
有关在客户端程序中获取会话状态更改信息的信息,请参见 第27.8.7.65节“mysql_session_track_get_first()”。
session_track_system_variables
| 属性 | 值 |
|---|---|
| 命令行格式 | --session-track-system-variables=# |
| 介绍 | 5.7.4 |
| 系统变量 | session_track_system_variables |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | time_zone, autocommit, character_set_client, character_set_results, character_set_connection |
控制服务器是否跟踪会话系统变量的更改,并在发生更改时使此信息可供客户端使用。变量值是一个逗号分隔的变量列表,用于跟踪变化。默认情况下,通知的启用
time_zone,
autocommit,
character_set_client,
character_set_results,和
character_set_connection。(后三个变量是受影响的变量
SET NAMES。)
特殊值*会导致服务器跟踪所有会话变量的更改。如果给定,则此值必须由自身指定,而不使用特定的系统变量名称。
即使新值与旧值相同,对所有跟踪会话系统变量的赋值也会发出通知。
有关在客户端程序中获取会话状态更改信息的信息,请参见 第27.8.7.65节“mysql_session_track_get_first()”。
sha256_password_auto_generate_rsa_keys
| 属性 | 值 |
|---|---|
| 命令行格式 | --sha256-password-auto-generate-rsa-keys[={OFF|ON}] |
| 介绍 | 5.7.5 |
| 系统变量 | sha256_password_auto_generate_rsa_keys |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 布尔 |
| 默认 | ON |
如果服务器使用OpenSSL进行编译,则此变量可用(请参见第6.4.4节“OpenSSL与yaSSL”)。它控制服务器是否自动生成数据目录中的RSA专用/公用密钥对文件(如果它们尚不存在)。
在启动时,如果sha256_password_auto_generate_rsa_keys
启用了系统变量,没有指定RSA选项,并且数据目录中缺少RSA文件,则服务器会自动在数据目录中生成RSA专用/公用密钥对文件
。这些文件使用RSA通过未加密连接为通过sha256_password插件验证的帐户启用安全密码交换
; 请参见
第6.5.1.4节“SHA-256可插入验证”。
有关RSA文件自动生成的更多信息,包括文件名和特征,请参见 第6.4.3.1节“使用MySQL创建SSL和RSA证书和密钥”
该auto_generate_certs
系统变量是相关的,但控制SSL证书,并需要使用SSL安全连接密钥文件的自动生成。
sha256_password_private_key_path
| 属性 | 值 |
|---|---|
| 命令行格式 | --sha256-password-private-key-path=file_name |
| 系统变量 | sha256_password_private_key_path |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
| 默认 | private_key.pem |
如果使用OpenSSL编译MySQL,则此变量可用(请参见第6.4.4节“OpenSSL与yaSSL”)。它的值是sha256_password认证插件的RSA私钥文件的路径名
。如果该文件被命名为相对路径,则相对于服务器数据目录进行解释。该文件必须采用PEM格式。
由于此文件存储私钥,因此应限制其访问模式,以便只有MySQL服务器才能读取它。
有关信息sha256_password,请参见
第6.5.1.4节“SHA-256可插入验证”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --sha256-password-proxy-users=[={OFF|ON}] |
| 介绍 | 5.7.7 |
| 系统变量 | sha256_password_proxy_users |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
该变量控制sha256_password内置身份验证插件是否
支持代理用户。除非check_proxy_users启用系统变量,否则它不起作用
。有关用户代理的信息,请参见
第6.3.10节“代理用户”。
这个变量是在MySQL 5.7.7中添加的。在5.7.7之前,
sha256_password不支持代理用户。
sha256_password_public_key_path
| 属性 | 值 |
|---|---|
| 命令行格式 | --sha256-password-public-key-path=file_name |
| 系统变量 | sha256_password_public_key_path |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
| 默认 | public_key.pem |
如果使用OpenSSL编译MySQL,则此变量可用(请参见第6.4.4节“OpenSSL与yaSSL”)。它的值是sha256_password认证插件的RSA公钥文件的路径名
。如果文件被命名为相对路径,则相对于服务器数据目录进行解释。该文件必须采用PEM格式。由于该文件存储公钥,可以将拷贝免费分发给客户端用户。(使用RSA密码加密连接到服务器时明确指定公钥的客户端必须使用与服务器使用的公钥相同的公钥。)
有关信息sha256_password(包括有关客户机如何指定RSA公钥的信息),请参见第6.5.1.4节“SHA-256可插入验证”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --shared-memory[={0,1}] |
| 系统变量 | shared_memory |
| 范围 | 全球 |
| 动态 | 没有 |
| 平台特定 | 视窗 |
| 类型 | 布尔 |
| 默认 | FALSE |
(仅限Windows。)服务器是否允许共享内存连接。
| 属性 | 值 |
|---|---|
| 命令行格式 | --shared-memory-base-name=name |
| 系统变量 | shared_memory_base_name |
| 范围 | 全球 |
| 动态 | 没有 |
| 平台特定 | 视窗 |
| 类型 | 串 |
| 默认 | MYSQL |
(仅限Windows)用于共享内存连接的共享内存的名称。在单个物理机器上运行多个MySQL实例时,这非常有用。默认名称是MYSQL。名称区分大小写。
| 属性 | 值 |
|---|---|
| 命令行格式 | --show-compatibility-56[={OFF|ON}] |
| 介绍 | 5.7.6 |
| 弃用 | 5.7.6 |
| 系统变量 | show_compatibility_56 |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认(> = 5.7.8) | OFF |
| 默认(<= 5.7.7) | ON |
该INFORMATION_SCHEMA表包含系统和状态变量信息(请参见
第24.10节“INFORMATION_SCHEMA GLOBAL_VARIABLES和SESSION_VARIABLES表”和
第24.9节“INFORMATION_SCHEMA GLOBAL_STATUS和SESSION_STATUS表”)。从MySQL 5.7.6开始,性能模式还包含系统和状态变量表(请参见
第25.11.13节“性能模式系统变量表”和
第25.11.14节“性能模式状态变量表”)。性能模式表旨在取代
INFORMATION_SCHEMA 表,这些表从MySQL 5.7.6开始不推荐使用,并且将在未来的MySQL版本中删除。
有关将INFORMATION_SCHEMA表从表迁移
到性能模式表的建议,请参见
第25.19节“迁移到性能模式系统和状态变量表”。为了帮助迁移,你可以使用
show_compatibility_56系统变量,它影响的MySQL 5.6的兼容性是否相对于能够如何系统状态变量信息由提供
INFORMATION_SCHEMA,并且还通过了与绩效模式表SHOW
VARIABLES和SHOW
STATUS报表。
show_compatibility_56已弃用,因为它的唯一目的是允许控制将在未来的MySQL版本中删除的不推荐使用的系统和状态变量信息源。当这些来源被删除时,
show_compatibility_56将没有任何用途,并且将被删除。
以下讨论描述了以下影响
show_compatibility_56:
为了更好地理解,强烈建议您也阅读这些部分:
该show_compatibility_56
系统变量会影响服务器正常运行的有关系统状态变量,这些方面:
可从SHOW
VARIABLES和SHOW
STATUS声明获得的信息
INFORMATION_SCHEMA提供系统和状态变量信息
的
表中提供的信息
Performance Schema表中提供的可提供系统和状态变量信息的信息
该效果FLUSH
STATUS声明状态变量
这个清单总结了show_compatibility_56后面的附加细节的影响
:
如果
show_compatibility_56是
ON,与MySQL 5.6的兼容性已启用。较早的变量信息源(SHOW语句,
INFORMATION_SCHEMA表)产生与MySQL 5.6中相同的输出。
什么时候
show_compatibility_56是
OFF,与MySQL 5.6的兼容性被禁用。INFORMATION_SCHEMA由于性能模式表旨在替换它们,因此从表中选择
会产生错误。这些INFORMATION_SCHEMA
表从MySQL 5.7.6开始已弃用,并将在未来的MySQL版本中删除。
获取系统状态变量信息何时
show_compatibility_56=OFF使用性能模式表或
SHOW语句。
当
show_compatibility_56=OFF时,SHOW VARIABLES和
SHOW STATUS报表显示从Performance模式行
global_variables,
session_variables,
global_status,和
session_status表格。
从MySQL 5.7.9开始,这些表是世界可读的,没有SELECT权限就可以访问
,这意味着SELECT也不需要使用这些SHOW语句。在MySQL 5.7.9之前,
SELECT需要有权限直接访问这些性能模式表,或者通过这些SHOW语句间接访问这些表
。
一些
状态变量可以从
当
是
。什么时候
是
,其中一些变量不会暴露。他们提供的信息可在复制相关的性能模式表中找到,如后面所述。
Slave_xxxSHOW STATUSshow_compatibility_56ONshow_compatibility_56OFFSHOW STATUS
show_compatibility_56具有使用上的系统变量访问没有效果
@@符号:
,
,
。
@@GLOBAL.var_name@@SESSION.var_name@@var_name
show_compatibility_56 对嵌入式服务器没有任何影响,在所有情况下都会生成5.6兼容的输出。
在以下的说明细节设置的效果
show_compatibility_56到
ON或OFF在其中该变量施加的上下文。
ON:MySQL 5.6输出。
OFF:输出显示Performance Schema global_variables表中的行
。
SHOW [SESSION
| LOCAL] VARIABLES 声明:
ON:MySQL 5.6输出。
OFF:输出显示Performance Schema session_variables表中的行
。(在MySQL 5.7.6和5.7.7中,OFF输出并不完全反映当前会话的所有系统变量值;它不包含没有会话副本的全局变量的行,这在MySQL 5.7.8中得到了纠正。)
ON:MySQL 5.6输出。
OFF:输出显示Performance Schema global_status表中的行
,以及
语句执行计数器。
Com_xxx
OFF输出不包含没有全局副本的会话变量的行,与ON输出不同
。
SHOW [SESSION |
LOCAL] STATUS 声明:
ON:MySQL 5.6输出。
OFF:输出显示Performance Schema session_status表中的行
,以及
语句执行计数器。(在MySQL 5.7.6和5.7.7中,
输出并不完全反映当前会话的所有状态变量值;它不包含没有会话对象的全局变量的行,这在MySQL 5.7.8中得到了纠正。)
Com_xxxOFF
在MySQL 5.7.6和5.7.7中,对于SHOW刚描述的每个
语句,使用
WHERE子句会在show_compatibility_56=ON出现错误时
产生警告
show_compatibility_56=OFF。(这适用于
WHERE未被优化的子句,例如,WHERE 1非常简单,被优化掉,因此不会产生警告或错误。)从MySQL 5.7.8开始不会发生此行为;
WHERE如5.7.6所述支持。
INFORMATION_SCHEMA表(GLOBAL_VARIABLES,
SESSION_VARIABLES,
GLOBAL_STATUS,和
SESSION_STATUS):
ON:MySQL 5.6输出,带有弃用警告。
OFF:从这些表中选择会产生错误。(在5.7.9之前,从这些表中选择不会产生输出,并带有弃用警告。)
性能架构系统变量表:
OFF:
global_variables:仅限全局系统变量。
session_variables:对当前会话有效的系统变量:每个会话变量的行,以及没有会话副本的每个全局变量的行。
variables_by_thread:仅用于每个活动会话的会话系统变量。
ON:与输出相同
OFF。(5.7.8之前,这些表格不会输出。)
性能架构状态变量表:
OFF:
global_status:仅限全局状态变量。
session_status:当前会话的状态变量:每个会话变量的行,以及没有会话副本的每个全局变量的行。
status_by_account 仅会话状态变量,每个帐户汇总。
status_by_host:仅会话状态变量,按每个主机名汇总。
status_by_thread:仅针对每个活动会话的会话状态变量。
status_by_user:仅会话状态变量,按每个用户名汇总。
性能模式不会收集
状态变量表中状态变量的统计信息
。要获取全局和每会话语句执行计数
,分别使用
和
表。
Com_xxxevents_statements_summary_global_by_event_nameevents_statements_summary_by_thread_by_event_name
ON:与输出相同
OFF。(在5.7.9之前,这些表格不会输出。)
从站状态变量:
ON:有几个
状态变量可从
。
Slave_xxxSHOW STATUS
OFF:这些从变量中的一些未暴露给SHOW STATUS
性能模式状态变量表。他们提供的信息可在复制相关的性能模式表中找到。下表显示了哪些
状态变量在Performance Schema复制表中不可用
以及它们的位置。
Slave_xxxSHOW STATUS
| 状态变量 | 性能架构位置 |
|---|---|
Slave_heartbeat_period |
replication_connection_configuration表,
HEARTBEAT_INTERVAL列 |
Slave_last_heartbeat |
replication_connection_status表,
LAST_HEARTBEAT_TIMESTAMP列 |
Slave_received_heartbeats |
replication_connection_status表,
COUNT_RECEIVED_HEARTBEATS列 |
Slave_retried_transactions |
replication_applier_status表,
COUNT_TRANSACTIONS_RETRIES列 |
Slave_running |
replication_connection_status和
replication_applier_status
表,SERVICE_STATE列 |
FLUSH STATUS 声明:
ON:这个语句产生MySQL 5.6行为。它将当前线程的会话状态变量值添加到全局值,并将会话值重置为零。一些全局变量也可以重置为零。它还会将密钥缓存的计数器(默认和已命名)重置为零,并设置
Max_used_connections为当前打开的连接数。
OFF:该语句将会话状态从所有活动会话添加到全局状态变量,重置所有活动会话的状态,并重置从断开会话聚合的帐户,主机和用户状态值。
| 属性 | 值 |
|---|---|
| 命令行格式 | --show-create-table-verbosity |
| 介绍 | 22年7月5日 |
| 系统变量 | show_create_table_verbosity |
| 范围 | 全球,会议 |
| 动态 | 是 |
SHOW CREATE TABLEROW_FORMAT如果行格式是默认格式,通常不会显示表格选项。无论是否为默认格式,启用此变量都会导致SHOW CREATE TABLE显示ROW_FORMAT。
| 属性 | 值 |
|---|---|
| 命令行格式 | --show-old-temporals={OFF|ON} |
| 介绍 | 5.7.6 |
| 弃用 | 5.7.6 |
| 系统变量 | show_old_temporals |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
是否SHOW CREATE TABLE
输出包括注释来发现在预5.6.4格式标志颞柱(TIME,
DATETIME,和
TIMESTAMP列不为小数精度秒支持)。这个变量默认是禁用的。如果启用,SHOW
CREATE TABLE输出如下所示:
CREATE TABLE`mytbl`( `ts` timestamp / * 5.5二进制格式* / NOT NULL DEFAULT CURRENT_TIMESTAMP, `dt` datetime / * 5.5二进制格式* / DEFAULT NULL, `t`时间/ * 5.5二进制格式* / DEFAULT NULL )DEFAULT CHARSET = latin1
表
的COLUMN_TYPE列的
输出INFORMATION_SCHEMA.COLUMNS受到相同的影响。
此变量已弃用,将在未来的MySQL版本中删除。
| 属性 | 值 |
|---|---|
| 命令行格式 | --skip-external-locking |
| 系统变量 | skip_external_locking |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 布尔 |
| 默认 | ON |
这是OFF如果mysqld
使用外部锁定(系统锁定),ON
如果外部锁定被禁用。这只影响
MyISAM表访问。
这个变量由--external-lockingor
--skip-external-locking
选项设置
。外部锁定默认是禁用的。
外部锁仅影响
MyISAM表访问。有关更多信息,包括可以使用和不可使用的条件,请参见第8.11.5节“外部锁定”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --skip-name-resolve |
| 系统变量 | skip_name_resolve |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 布尔 |
| 默认 | OFF |
该变量是从该--skip-name-resolve选项的值中设置的
。如果是这样OFF,mysqld
在检查客户端连接时解析主机名。如果是
ON,mysqld只使用IP号码; 在这种情况下,Host授权表中的所有列值必须是IP地址或
localhost。请参见
第8.12.5.2节“DNS查找优化和主机缓存”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --skip-networking |
| 系统变量 | skip_networking |
| 范围 | 全球 |
| 动态 | 没有 |
这是ON如果服务器只允许本地(非TCP / IP)连接。在Unix上,本地连接使用Unix套接字文件。在Windows上,本地连接使用命名管道或共享内存。该变量可以通过ON该
--skip-networking选项设置
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --skip-show-database |
| 系统变量 | skip_show_database |
| 范围 | 全球 |
| 动态 | 没有 |
这可以防止人们在SHOW
DATABASES没有SHOW DATABASES权限的情况下使用该语句
。如果您担心用户能够看到属于其他用户的数据库,可以提高安全性。其效果取决于SHOW DATABASES
特权:如果变量值为ON,则该
SHOW DATABASES语句仅被允许具有该SHOW
DATABASES特权的用户使用,并且该语句显示所有数据库名称。如果值为OFF,
SHOW DATABASES则允许所有用户使用,但仅显示用户拥有该SHOW
DATABASES权限或其他权限的那些数据库的名称。(请注意,
任何 全局特权被认为是数据库的特权。)
| 属性 | 值 |
|---|---|
| 命令行格式 | --slow-launch-time=# |
| 系统变量 | slow_launch_time |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 2 |
如果创建线程的时间超过了这么多秒,服务器就会增加
Slow_launch_threads状态变量。
| 属性 | 值 |
|---|---|
| 命令行格式 | --slow-query-log |
| 系统变量 | slow_query_log |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
是否启用慢查询日志。该值可以是0(或
OFF)以禁用日志或1(或
ON)以启用日志。默认值取决于是否
--slow_query_log给出选项。日志输出的目的地由log_output系统变量控制
; 如果该值是NONE,即使启用日志,也不会写入日志条目。
“ 慢 ”由long_query_time变量的值决定
。请参见
第5.4.5节“慢速查询日志”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --slow-query-log-file=file_name |
| 系统变量 | slow_query_log_file |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 文件名 |
| 默认 | host_name-slow.log |
慢查询日志文件的名称。默认值是
,但可以使用该host_name-slow.log--slow_query_log_file选项更改初始值
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --socket={file_name|pipe_name} |
| 系统变量 | socket |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型(其他) | 串 |
| 类型(Windows) | 串 |
| 默认(其他) | /tmp/mysql.sock |
| 默认(Windows) | MySQL |
在Unix平台上,该变量是用于本地客户端连接的套接字文件的名称。默认是
/tmp/mysql.sock。(对于某些分发格式,目录可能不同,例如
/var/lib/mysqlRPM。)
在Windows上,此变量是用于本地客户端连接的命名管道的名称。默认值是
MySQL(不区分大小写)。
| 属性 | 值 |
|---|---|
| 命令行格式 | --sort-buffer-size=# |
| 系统变量 | sort_buffer_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(其他,64位平台) | 整数 |
| 类型(其他32位平台) | 整数 |
| 类型(Windows) | 整数 |
| 默认(其他,64位平台) | 262144 |
| 默认(其他32位平台) | 262144 |
| 默认(Windows) | 262144 |
| 最小(其他64位平台) | 32768 |
| 最小(其他32位平台) | 32768 |
| 最小(Windows) | 32768 |
| 最大(其他64位平台) | 18446744073709551615 |
| 最大(其他32位平台) | 4294967295 |
| 最大(Windows) | 4294967295 |
每个必须执行排序的会话都会分配一个这种大小的缓冲区。sort_buffer_size
并不特定于任何存储引擎,并以通用方式应用于优化。最小值
sort_buffer_size必须足够大以容纳排序缓冲区中的15个元组。另外,增加价值
max_sort_length可能需要增加价值
sort_buffer_size。有关更多信息,请参见第8.2.1.13节“按优化排序”
如果你Sort_merge_passes在SHOW GLOBAL
STATUS输出中看到每秒很多
,你可以考虑增加
sort_buffer_size值来加速ORDER BY或GROUP
BY通过查询优化或索引改进无法改进的操作。
优化器会尝试计算出需要多少空间,但可以分配更多空间,最大限度。将它设置为大于全局所需的大小会减慢大多数排序的查询。最好将它作为会话设置增加,并且仅限于需要更大尺寸的会话。在Linux上,有256KB和2MB的阈值,其中较大的值可能会显着减慢内存分配,所以您应该考虑保持低于其中一个值。试着为你的工作量找到最好的价值。请参见 第B.5.3.5节“MySQL存储临时文件的位置”。
最大允许设置为
sort_buffer_size4GB-1。64位平台允许使用较大的值(64位Windows除外,其中较大的值被截断为4GB-1,并带有警告)。
| 属性 | 值 |
|---|---|
| 系统变量 | sql_auto_is_null |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | 0 |
如果此变量设置为1,则在成功插入自动生成的AUTO_INCREMENT值的语句后
,可以通过发出以下格式的语句来找到该值:
SELECT * FROMtbl_nameWHEREauto_col是NULL
如果语句返回一行,则返回的值与调用该LAST_INSERT_ID()函数的值相同
。有关详细信息(包括多行插入后的返回值),请参见第12.14节“信息函数”。如果未
AUTO_INCREMENT成功插入值,则该SELECT语句不返回任何行。
某些ODBC程序(如Access)使用通过比较
检索AUTO_INCREMENT值
的行为
IS NULL。请参阅
获取自动增量值。此行为可以通过设置sql_auto_is_null为0 来禁用
。
默认值
sql_auto_is_null是0。
| 属性 | 值 |
|---|---|
| 系统变量 | sql_big_selects |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | 1 |
如果设置为0,则MySQL将放弃
SELECT可能需要很长时间才能执行的语句(即优化程序估计所检查的行数超过值的语句
max_join_size)。这WHERE在发布不适宜的声明时很有用。新连接的默认值是1,它允许所有SELECT
语句。
如果将max_join_size
系统变量设置为除以外的值
DEFAULT,
sql_big_selects则设置为0。
| 属性 | 值 |
|---|---|
| 系统变量 | sql_buffer_result |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | 0 |
如果设置为1,则
sql_buffer_result强制将SELECT语句的结果放入临时表中。这有助于MySQL尽早释放表锁,并且在将结果发送到客户端需要很长时间的情况下可能会有所帮助。默认值是0。
| 属性 | 值 |
|---|---|
| 系统变量 | sql_log_bin |
| 范围 | 会议 |
| 动态 | 是 |
| 类型 | 布尔 |
该变量控制是否完成对二进制日志的记录。默认值是1(做日志记录)。要更改当前会话的日志记录,请更改此变量的会话值。会话用户必须有权
SUPER设置此变量。
无法@@session.sql_log_bin在事务或子查询中进行设置
。
将此变量设置为0可防止将GTID分配给二进制日志中的事务。如果您正在使用GTID进行复制,这意味着,即使二进制日志记录稍后再次启用,从此刻写入日志的GTID也不会考虑同时发生的任何事务 - 实际上,这些事务将丢失。
全局sql_log_bin
变量是只读的,不能修改。全局范围已被弃用,并将在未来的MySQL版本中被删除。
| 属性 | 值 |
|---|---|
| 系统变量 | sql_log_off |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | 0 |
此变量控制是否记录到常规查询日志已完成。默认值是0(做日志记录)。要更改当前会话的日志记录,请更改此变量的会话值。会话用户必须有权
SUPER设置此选项。默认值是0。
| 属性 | 值 |
|---|---|
| 命令行格式 | --sql-mode=name |
| 系统变量 | sql_mode |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 组 |
| 默认(> = 5.7.8) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION |
| 默认(5.7.7) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION |
| 默认(> = 5.7.5,<= 5.7.6) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION |
| 默认(<= 5.7.4) | NO_ENGINE_SUBSTITUTION |
| 有效值 |
|
当前的服务器SQL模式,可以动态设置。有关详细信息,请参见第5.1.8节“服务器SQL模式”。
MySQL安装程序可能会在安装过程中配置SQL模式。例如,
mysql_install_db将创建一个my.cnf在基本安装目录中指定的默认选项文件。该文件包含设置SQL模式的行; 请参见第4.4.2节“ mysql_install_db - 初始化MySQL数据目录”。
如果SQL模式与默认或预期不同,请检查服务器在启动时读取的选项文件中的设置。
如果设置为1(默认值),则Note
级别递增警告warning_count和服务器将记录它们。如果设置为0,则Note
警告不会增加
warning_count,并且服务器不记录它们。mysqldump包含将此变量设置为0的输出,以便重新加载转储文件不会对不影响重新加载操作完整性的事件发出警告。
如果设置为1(默认值),服务器将引用SHOW CREATE TABLE和
SHOW CREATE DATABASE
语句的标识符
。如果设置为0,则禁用引用。此选项默认启用,因此复制适用于需要引用的标识符。请参见第13.7.5.10节“SHOW CREATE TABLE语法”和第13.7.5.6节“SHOW CREATE DATABASE语法”。
如果设置为1,则MySQL中止
UPDATE或
DELETE在WHERE子句或LIMIT子句中不使用键的
语句。(具体来说,
UPDATE语句必须有一个
WHERE使用键或
LIMIT子句的子句,或者两者都有。DELETE语句必须同时具有这两个
语句。)这可以捕获
UPDATE或
DELETE声明密钥使用不当并且可能会更改或删除大量行。默认值是0。
| 属性 | 值 |
|---|---|
| 系统变量 | sql_select_limit |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
从SELECT语句返回的最大行数
。新连接的默认值是服务器每个表允许的最大行数。典型的默认值是(2 32)-1或(2 64)-1。如果您更改了限制,则可以通过指定值来恢复默认值DEFAULT。
如果a SELECT有一个
LIMIT子句,LIMIT
则优先于的值
sql_select_limit。
该变量控制INSERT在发生警告时单行语句是否
产生信息字符串。默认值为0.将该值设置为1以生成信息字符串。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ssl-ca=file_name |
| 系统变量 | ssl_ca |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
具有可信SSL证书颁发机构列表的文件的路径。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ssl-capath=dir_name |
| 系统变量 | ssl_capath |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
包含PEM格式的可信SSL证书的目录的路径。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ssl-cert=file_name |
| 系统变量 | ssl_cert |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
用于建立安全连接的SSL证书文件的名称。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ssl-cipher=name |
| 系统变量 | ssl_cipher |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
SSL加密允许的密码列表。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ssl-crl=file_name |
| 系统变量 | ssl_crl |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
以PEM格式包含证书吊销列表的文件的路径。撤销列表适用于使用OpenSSL(但不是yaSSL)编译的MySQL发行版。请参见 第6.4.4节“OpenSSL与yaSSL”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ssl-crlpath=dir_name |
| 系统变量 | ssl_crlpath |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
包含PEM格式的证书撤销列表文件的目录的路径。撤销列表适用于使用OpenSSL(但不是yaSSL)编译的MySQL发行版。请参见第6.4.4节“OpenSSL与yaSSL”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --ssl-key=file_name |
| 系统变量 | ssl_key |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 文件名 |
用于建立安全连接的SSL密钥文件的名称。
| 属性 | 值 |
|---|---|
| 删除 | 5.7.5 |
| 系统变量 | storage_engine |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | InnoDB |
这个变量已被弃用,并在MySQL 5.7.5中被删除。default_storage_engine
改为使用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --stored-program-cache=# |
| 系统变量 | stored_program_cache |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 256 |
| 最小(> = 5.7.6) | 16 |
| 最小(<= 5.7.5) | 256 |
| 最大 | 524288 |
为每个连接的缓存存储例程设置一个软上限。这个变量的值是根据MySQL服务器分别为存储过程和存储函数维护的两个缓存中每一个缓存中存储的例程数量指定的。
无论何时执行存储例程,都会在解析例程中的第一个或顶级语句之前检查此高速缓存大小; 如果相同类型(存储过程或正在执行的存储函数)的例程数量超过了此变量指定的限制,则刷新相应的缓存,并释放先前为缓存对象分配的内存。这样即使存储的例程之间存在依赖关系,也可以安全地刷新缓存。
| 属性 | 值 |
|---|---|
| 命令行格式 | --super-read-only[={OFF|ON}] |
| 介绍 | 5.7.8 |
| 系统变量 | super_read_only |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
如果read_only系统变量已启用,则服务器只允许具有该SUPER
权限的用户进行客户端更新。如果super_read_only还启用了
系统变量,则服务器甚至禁止客户端更新,甚至禁止用户更新SUPER。有关read_only只读模式的描述以及有关如何read_only和
super_read_only交互的信息,请参阅
系统变量的说明
。
super_read_only主服务器上的
更改不会复制到从服务器。该值可以在从服务器上进行设置,与主服务器上的设置无关。
| 属性 | 值 |
|---|---|
| 命令行格式 | --sync-frm |
| 弃用 | 5.7.6 |
| 系统变量 | sync_frm |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | TRUE |
如果此变量设置为1,则在创建任何非临时表时,其.frm文件将同步到磁盘(使用fdatasync())。如果发生碰撞,速度会更慢但更安全。默认值是1。
这个变量在MySQL 5.7.6中不推荐使用,并且将在未来版本的MySQL中被删除(当.frm
文件变得过时时)。
| 属性 | 值 |
|---|---|
| 系统变量 | system_time_zone |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
服务器系统时区。服务器开始执行时,它会从机器默认值中继承时区设置,可能会由用于运行服务器的帐户的环境或启动脚本进行修改。该值用于设置system_time_zone。通常,时区由TZ环境变量指定
。它也可以使用mysqld_safe脚本的--timezone选项
指定
。
的system_time_zone变量不同于time_zone。虽然它们可能具有相同的值,但后一个变量用于初始化连接的每个客户端的时区。请参见第5.1.10节“MySQL服务器时区支持”。
| 属性 | 值 |
|---|---|
| 系统变量 | table_definition_cache |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | -1 (autosized) |
| 最低限度 | 400 |
| 最大 | 524288 |
.frm可以存储在定义缓存中
的表定义(来自文件)的数量
。如果您使用大量表格,则可以创建一个大型表格定义缓存来加速表格的打开。与普通表缓存不同,表定义缓存占用更少的空间并且不使用文件描述符。最小值为400.默认值基于以下公式,最大值限制为2000:
400 +(table_open_cache / 2)
对于InnoDB,
table_definition_cache作为在打开的表实例的数量软限制
InnoDB数据字典高速缓存。如果打开的表实例的数量超过
table_definition_cache
设置,LRU机制开始标记用于驱逐的表实例,并最终将它们从数据字典高速缓存中移除。该限制有助于解决在下次服务器重新启动之前将使用大量内存来缓存很少使用的表实例的情况。具有缓存的元数据的表实例数量可能会高于由此定义的限制
table_definition_cache,因为InnoDB系统表实例以及具有外键关系的父表和子表实例不放置在LRU列表上,并且不会从内存中逐出。
此外,还
table_definition_cache
定义了一个InnoDB可以同时打开的每个表文件表空间的数量的软限制
,这也受到控制
innodb_open_files。如果同时
table_definition_cache和
innodb_open_files设置,使用最高设置。如果两个变量均未设置table_definition_cache,则使用默认值较高的变量
。如果打开的表空间文件句柄的数量超过了table_definition_cacheor
定义的限制
innodb_open_files,则LRU机制将搜索表空间文件LRU列表以查找已完全刷新并且当前未被扩展的文件。每次打开新表空间时都会执行此过程。如果没有“ 非活动 ”表空间,没有表空间文件被关闭。
| 属性 | 值 |
|---|---|
| 系统变量 | table_open_cache |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 2000 |
| 最低限度 | 1 |
| 最大 | 524288 |
所有线程的打开表的数量。增加此值会增加mysqld所需的文件描述符的数量
。您可以通过检查Opened_tables状态变量来检查是否需要增加表缓存
。请参见第5.1.7节“服务器状态变量”。如果值Opened_tables
很大并且不FLUSH
TABLES经常使用(这会强制所有表被关闭并重新打开),那么您应该增加table_open_cache
变量的值。有关表缓存的更多信息,请参见
第8.4.3.1节“MySQL如何打开和关闭表”。
| 属性 | 值 |
|---|---|
| 系统变量 | table_open_cache_instances |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认(> = 5.7.8) | 16 |
| 默认(<= 5.7.7) | 1 |
| 最低限度 | 1 |
| 最大 | 64 |
打开表格缓存实例的数量。为了通过减少会话之间的争用来提高可伸缩性,可以将开放表缓存分区为几个较小的缓存大小为table_open_cache/的
实例
table_open_cache_instances。会话需要锁定一个实例才能访问DML语句。这将实例中的缓存访问分段,允许在有许多会话访问表时使用缓存的操作具有更高的性能。(DDL语句仍然需要对整个缓存进行锁定,但这种语句比DML语句的频率要低得多。)
在常规使用16个或更多内核的系统上,建议使用8或16的值。
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-cache-size=# |
| 系统变量 | thread_cache_size |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | -1 (autosized) |
| 最低限度 | 0 |
| 最大 | 16384 |
服务器应该缓存多少个线程以供重用。当客户端断开时,如果thread_cache_size线程少于线程,客户端的线程将被放入缓存中
。如果可能的话,通过重用使用高速缓存的线程来满足线程请求,并且只有在高速缓存为空时才创建新的线程。如果您有很多新连接,则可以增加此变量以提高性能。通常,如果你有一个好的线程实现,这不会提供显着的性能改进。但是,如果您的服务器每秒看到数百个连接,则通常应该设置
thread_cache_size足够高,以便大多数新连接使用缓存线程。通过检查Connections和
Threads_created状态变量的区别
,你可以看到线程缓存的效率。有关详细信息,请参见第5.1.7节“服务器状态变量”。
默认值基于以下公式,上限为100:
8 +(max_connections / 100)
这个变量对嵌入式服务器(libmysqld)没有任何影响,从MySQL 5.7.2开始,在嵌入式服务器中不再可见。
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-concurrency=# |
| 弃用 | 是的(在5.7.2中删除) |
| 系统变量 | thread_concurrency |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 10 |
| 最低限度 | 1 |
| 最大 | 512 |
此变量特定于Solaris 8和更早版本的系统,为此,mysqldthr_setconcurrency()使用变量值调用该
函数。此函数使应用程序能够向线程系统提供有关应该同时运行的所需线程数的提示。目前的Solaris版本将其记录为无效。
MySQL 5.7.2中删除了这个变量。
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-handling=name |
| 系统变量 | thread_handling |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 列举 |
| 默认 | one-thread-per-connection |
| 有效值(> = 5.7.9) |
|
| 有效值(<= 5.7.8) |
|
服务器用于连接线程的线程处理模型。允许的值是
no-threads(服务器使用单个线程来处理一个连接)和
one-thread-per-connection(服务器使用一个线程处理每个客户端连接)。
no-threads在Linux下进行调试非常有用; 请参见第28.5节“调试和移植MySQL”。
这个变量对嵌入式服务器(libmysqld)没有任何影响,从MySQL 5.7.2开始,在嵌入式服务器中不再可见。
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-pool-algorithm=# |
| 介绍 | 5.7.9 |
| 系统变量 | thread_pool_algorithm |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 1 |
该变量控制线程池插件使用的算法:
值为0(默认值)使用保守的低并发算法,该算法经过最佳测试,并且已知会产生非常好的结果。
值为1会增加并发性,并使用更具侵略性的算法,有时已知该算法在优化线程数量上执行5-10%,但随着连接数目的增加,性能会下降。它的使用应该被认为是实验性的并且不被支持。
这个变量是在MySQL 5.7.9中添加的。只有在启用线程池插件时才可用。请参见 第5.5.3节“MySQL企业线程池”
thread_pool_high_priority_connection
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-pool-high-priority-connection=# |
| 介绍 | 5.7.9 |
| 系统变量 | thread_pool_high_priority_connection |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 1 |
这个变量在执行之前会影响新语句的排队。如果值为0(false,默认值),语句排队将同时使用低优先级队列和高优先级队列。如果值为1(真),则排队的语句总是进入高优先级队列。
这个变量是在MySQL 5.7.9中添加的。只有在启用线程池插件时才可用。请参见 第5.5.3节“MySQL企业线程池”
thread_pool_max_unused_threads
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-pool-max-unused-threads=# |
| 介绍 | 5.7.9 |
| 系统变量 | thread_pool_max_unused_threads |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 0 |
| 最低限度 | 0 |
| 最大 | 4096 |
线程池中未使用线程的最大允许数量。该变量可以限制睡眠线程使用的内存量。
值为0(默认值)表示对睡眠线程数没有限制。的值N
,其中N大于0意味着1个消费者线程和N-1储备线程。在这种情况下,如果线程已准备好进入睡眠状态,但睡眠线程的数量已达到最大值,则线程将退出而不是休眠。
休眠线程或者作为消费者线程或预留线程休眠。线程池允许一个线程在睡眠时成为消费者线程。如果线程进入睡眠状态并且没有现有的消费者线程,它将作为消费者线程休眠。当一个线程必须被唤醒时,如果有一个消费者线程被选中。只有当没有消费者线程被唤醒时才选择保留线程。
这个变量是在MySQL 5.7.9中添加的。只有在启用线程池插件时才可用。请参见 第5.5.3节“MySQL企业线程池”
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-pool-prio-kickup-timer=# |
| 介绍 | 5.7.9 |
| 系统变量 | thread_pool_prio_kickup_timer |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 1000 |
| 最低限度 | 0 |
| 最大 | 4294967294 |
该变量影响在低优先级队列中等待执行的语句。该值是等待语句移至高优先级队列之前的毫秒数。默认值是1000(1秒)。值的范围是0到2 32 - 2。
这个变量是在MySQL 5.7.9中添加的。只有在启用线程池插件时才可用。请参见 第5.5.3节“MySQL企业线程池”
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-pool-size=# |
| 介绍 | 5.7.9 |
| 系统变量 | thread_pool_size |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 16 |
| 最低限度 | 1 |
| 最大 | 64 |
线程池中的线程组数量。这是控制线程池性能的最重要的参数。它影响可以同时执行多少个语句。默认值为16,范围从1到64的允许值。如果指定了此范围之外的值,则线程池插件不会加载,并且服务器会将消息写入错误日志。
这个变量是在MySQL 5.7.9中添加的。只有在启用线程池插件时才可用。请参见 第5.5.3节“MySQL企业线程池”
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-pool-stall-limit=# |
| 介绍 | 5.7.9 |
| 系统变量 | thread_pool_stall_limit |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 6 |
| 最低限度 | 4 |
| 最大 | 600 |
这个变量影响执行语句。该值是语句在开始执行之后必须完成的时间,在它被定义为停顿之前,此时线程池允许线程组开始执行另一个语句。该值以10毫秒为单位进行测量,因此值为6(默认值)表示60毫秒。值的范围是4到600(40ms到6s)。短的等待值允许线程更快地启动。短值也可以更好地避免死锁情况。对于包含长时间运行语句的工作负载来说,长等待值非常有用,以避免在当前执行语句时启动太多新语句。
这个变量是在MySQL 5.7.9中添加的。只有在启用线程池插件时才可用。请参见 第5.5.3节“MySQL企业线程池”
| 属性 | 值 |
|---|---|
| 命令行格式 | --thread-stack=# |
| 系统变量 | thread_stack |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型(64位平台) | 整数 |
| 类型(32位平台) | 整数 |
| 默认(64位平台) | 262144 |
| 默认(32位平台) | 196608 |
| 最低(64位平台) | 131072 |
| 最低(32位平台) | 131072 |
| 最大(64位平台) | 18446744073709551615 |
| 最大(32位平台) | 4294967295 |
| 块大小(64位平台) | 1024 |
| 块大小(32位平台) | 1024 |
每个线程的堆栈大小。默认192KB(64位系统为256KB)对于正常操作而言足够大。如果线程堆栈太小,则会限制服务器可以处理的SQL语句的复杂性,存储过程的递归深度以及其他耗费内存的操作。
这个变量未被使用。它已被弃用,并在MySQL 8.0中被删除。
| 属性 | 值 |
|---|---|
| 系统变量 | time_zone |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
当前时区。此变量用于初始化每个连接的客户端的时区。缺省情况下,该初始值是'SYSTEM'(这意味着, “ 使用的值
system_time_zone ”)。该值可以在服务器启动时通过该--default-time-zone选项明确指定。请参见第5.1.10节“MySQL服务器时区支持”。
如果设置为SYSTEM,则每个需要时区计算的MySQL函数调用都会调用系统库来确定当前系统时区。此调用可能受全局互斥体保护,导致争用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --timed-mutexes |
| 弃用 | 是(在5.7.5中删除) |
| 系统变量 | timed_mutexes |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
这个不推荐使用的变量没有用处,并且在MySQL 5.7.5中被删除。
| 属性 | 值 |
|---|---|
| 系统变量 | timestamp |
| 范围 | 会议 |
| 动态 | 是 |
| 类型 | 数字 |
为此客户设定时间。如果您使用二进制日志恢复行,这将用于获取原始时间戳。
timestamp_value应该是一个Unix纪元时间戳(类似于返回
UNIX_TIMESTAMP()的值,而不是'YYYY-MM-DD hh:mm:ss'格式中的值)或
DEFAULT。
设置timestamp为一个常数会导致它保留该值,直到它再次被更改。设置
timestamp为
DEFAULT使其值成为访问时的当前日期和时间。
在MySQL 5.7,
timestamp是
DOUBLE不是
BIGINT因为它的价值包括微秒的部分。
SET timestamp影响由NOW()但不是由
返回的值
SYSDATE()。这意味着二进制日志中的时间戳设置对调用无效SYSDATE()。服务器可以使用--sysdate-is-now选项来启动,
SYSDATE()使其成为别名NOW(),在这种情况下
SET timestamp会影响这两种功能。
| 属性 | 值 |
|---|---|
| 命令行格式 | --tls-version=protocol_list |
| 介绍 | 5.7.10 |
| 系统变量 | tls_version |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
| 默认 |
|
服务器允许的加密连接协议。该值是一个包含一个或多个协议名称的逗号分隔列表。可以为这个变量命名的协议取决于用于编译MySQL的SSL库。有关详细信息,请参见 第6.4.6节“加密连接协议和密码”。
| 属性 | 值 |
|---|---|
| 命令行格式 | --tmp-table-size=# |
| 系统变量 | tmp_table_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 整数 |
| 默认 | 16777216 |
| 最低限度 | 1024 |
| 最大 | 18446744073709551615 |
内部内存临时表的最大大小。该变量不适用于用户创建的
MEMORY表格。
实际限制取决于哪个值
tmp_table_size和
max_heap_table_size更小。如果内存中的临时表超出限制,MySQL会自动将其转换为磁盘上的临时表。从MySQL 5.7.5开始,该
internal_tmp_disk_storage_engine
选项定义用于磁盘临时表的存储引擎。在MySQL 5.7.5之前,使用了MyISAM
存储引擎。
如果您执行许多高级
查询并且您拥有大量内存,请
增加tmp_table_size(
max_heap_table_size如果需要)的值
GROUP BY。
您可以将创建的内部磁盘临时表的数量与通过比较Created_tmp_disk_tables和
Created_tmp_tables
变量的值创建的内部临时表的总数进行比较
。
| 属性 | 值 |
|---|---|
| 命令行格式 | --tmpdir=dir_name |
| 系统变量 | tmpdir |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 目录名称 |
用于临时文件和临时表的目录。该变量可以设置为以循环方式使用的多个路径的列表。路径应该由:Unix上的冒号()和;Windows上的分号()分隔。
多目录功能可用于在多个物理磁盘之间传播负载。如果MySQL服务器充当复制从服务器,则不应将其设置
tmpdir为指向基于内存的文件系统上的目录或指向服务器主机重新启动时清除的目录。复制从服务器需要一些临时文件以保证机器重新启动,以便复制临时表或
LOAD DATA
INFILE操作。如果服务器重新启动时临时文件目录中的文件丢失,复制将失败。您可以使用slave_load_tmpdir变量设置从站的临时目录
。在这种情况下,奴隶不会使用一般
tmpdir价值,你可以设置
tmpdir为非永久位置。
| 属性 | 值 |
|---|---|
| 命令行格式 | --transaction-alloc-block-size=# |
| 系统变量 | transaction_alloc_block_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台,<= 5.7.5) | 整数 |
| 类型(32位平台,<= 5.7.5) | 整数 |
| 类型(> = 5.7.6) | 整数 |
| 默认(64位平台,<= 5.7.5) | 8192 |
| 默认(32位平台,<= 5.7.5) | 8192 |
| 默认(> = 5.7.6) | 8192 |
| 最小(64位平台,<= 5.7.5) | 1024 |
| 最小(32位平台,<= 5.7.5) | 1024 |
| 最小(> = 5.7.6) | 1024 |
| 最大(64位平台,<= 5.7.5) | 18446744073709551615 |
| 最大(32位平台,<= 5.7.5) | 4294967295 |
| 最大(> = 5.7.6) | 131072 |
| 块大小(64位平台,<= 5.7.5) | 1024 |
| 块大小(32位平台,<= 5.7.5) | 1024 |
| 块大小(> = 5.7.6) | 1024 |
用于增加需要内存的每个事务内存池的字节数。请参阅说明
transaction_prealloc_size。
| 属性 | 值 |
|---|---|
| 命令行格式 | --transaction-isolation=name |
| 系统变量(> = 5.7.20) | transaction_isolation |
| 范围(> = 5.7.20) | 全球,会议 |
| 动态(> = 5.7.20) | 是 |
| 类型 | 列举 |
| 默认 | REPEATABLE-READ |
| 有效值 |
|
默认事务隔离级别。默认为
REPEATABLE-READ。
这个变量可以直接设置,也可以使用SET TRANSACTION语句间接设置
。请参见
第13.3.6节“SET TRANSACTION语法”。如果transaction_isolation
直接设置
为包含空格的隔离级别名称,则应将该名称用引号括起来,并用短划线替换空格。例如:
SET transaction_isolation ='READ-COMMITTED';
任何有效值的唯一前缀可用于设置此变量的值。
默认事务隔离级别也可以在启动时使用--transaction-isolation服务器选项进行设置
。
transaction_isolation被添加到MySQL 5.7.20中作为别名
tx_isolation,现在已被弃用,并在MySQL 8.0中被删除。应将应用程序调整为transaction_isolation优先使用
tx_isolation。
| 属性 | 值 |
|---|---|
| 命令行格式 | --transaction-prealloc-size=# |
| 系统变量 | transaction_prealloc_size |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(64位平台,<= 5.7.5) | 整数 |
| 类型(32位平台,<= 5.7.5) | 整数 |
| 类型(> = 5.7.6) | 整数 |
| 默认(64位平台,<= 5.7.5) | 4096 |
| 默认(32位平台,<= 5.7.5) | 4096 |
| 默认(> = 5.7.6) | 4096 |
| 最小(64位平台,<= 5.7.5) | 1024 |
| 最小(32位平台,<= 5.7.5) | 1024 |
| 最小(> = 5.7.6) | 1024 |
| 最大(64位平台,<= 5.7.5) | 18446744073709551615 |
| 最大(32位平台,<= 5.7.5) | 4294967295 |
| 最大(> = 5.7.6) | 131072 |
| 块大小(64位平台,<= 5.7.5) | 1024 |
| 块大小(32位平台,<= 5.7.5) | 1024 |
| 块大小(> = 5.7.6) | 1024 |
有一个按事务处理的内存池,各种与事务有关的分配从中获取内存。池的初始大小以字节为单位
transaction_prealloc_size。对于每个由于内存不足而无法满足的分配,该池transaction_alloc_block_size
将按字节增加
。当事务结束时,池被截断为
transaction_prealloc_size
字节。
通过设置
transaction_prealloc_size
足够大以包含单个事务中的所有语句,可以避免多次malloc()
调用。
| 属性 | 值 |
|---|---|
| 命令行格式 | --transaction-read-only |
| 系统变量(> = 5.7.20) | transaction_read_only |
| 范围(> = 5.7.20) | 全球,会议 |
| 动态(> = 5.7.20) | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
默认的事务访问模式。该值可以是
OFF(读/写,默认值)或
ON(只读)。
这个变量可以直接设置,也可以使用SET TRANSACTION语句间接设置
。请参见
第13.3.6节“SET TRANSACTION语法”。
要在启动时设置默认事务访问模式,请使用
--transaction-read-only服务器选项。
transaction_read_only被添加到MySQL 5.7.20中作为别名
tx_read_only,现在已被弃用,并在MySQL 8.0中被删除。应将应用程序调整为transaction_read_only优先使用
tx_read_only。
transaction_write_set_extraction
| 属性 | 值 |
|---|---|
| 命令行格式 | --transaction-write-set-extraction=[value] |
| 介绍 | 5.7.6 |
| 系统变量 | transaction_write_set_extraction |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | OFF |
| 有效值(> = 5.7.14) |
|
| 有效值(<= 5.7.13) |
|
定义用于生成标识与事务关联的写入的散列的算法。如果您使用组复制,则散列值将用于分布式冲突检测和处理。在运行组复制的64位系统上,我们建议将其设置
XXHASH64为避免不必要的散列冲突,从而导致认证失败并回滚用户事务。请参见
第17.7.1节“组复制要求”。
| 属性 | 值 |
|---|---|
| 弃用 | 20年7月5日 |
| 系统变量 | tx_isolation |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 列举 |
| 默认 | REPEATABLE-READ |
| 有效值 |
|
默认事务隔离级别。默认为
REPEATABLE-READ。
这个变量可以直接设置,也可以使用SET TRANSACTION语句间接设置
。请参见
第13.3.6节“SET TRANSACTION语法”。如果tx_isolation直接设置
为包含空格的隔离级别名称,则应将该名称用引号括起来,并用短划线替换空格。例如:
SET tx_isolation ='READ-COMMITTED';
任何有效值的唯一前缀可用于设置此变量的值。
默认事务隔离级别也可以在启动时使用--transaction-isolation服务器选项进行设置
。
transaction_isolation被添加到MySQL 5.7.20中作为别名
tx_isolation,现在已被弃用,并在MySQL 8.0中被删除。应将应用程序调整为transaction_isolation优先使用
tx_isolation。
| 属性 | 值 |
|---|---|
| 弃用 | 20年7月5日 |
| 系统变量 | tx_read_only |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | OFF |
默认的事务访问模式。该值可以是
OFF(读/写,默认值)或
ON(只读)。
这个变量可以直接设置,也可以使用SET TRANSACTION语句间接设置
。请参见
第13.3.6节“SET TRANSACTION语法”。
要在启动时设置默认事务访问模式,请使用
--transaction-read-only服务器选项。
transaction_read_only被添加到MySQL 5.7.20中作为别名
tx_read_only,现在已被弃用,并在MySQL 8.0中被删除。应将应用程序调整为transaction_read_only优先使用
tx_read_only。
| 属性 | 值 |
|---|---|
| 系统变量 | unique_checks |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | 1 |
如果设置为1(默认值),InnoDB则执行对表中二级索引的唯一性检查。如果设置为0,则允许存储引擎假定重复键不存在于输入数据中。如果您确实知道您的数据不包含唯一性违规,则可以将其设置为0以加快大表导入
InnoDB。
将此变量设置为0 不需要存储引擎忽略重复键。引擎仍然可以检查它们,如果检测到它们,则会发出重复键错误。
| 属性 | 值 |
|---|---|
| 命令行格式 | --updatable-views-with-limit=# |
| 系统变量 | updatable_views_with_limit |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | 1 |
如果更新语句包含LIMIT子句,则此视图控制是否可以在视图不包含基础表中定义的主键的所有列时更新视图。(这些更新通常由GUI工具生成。)更新是一个UPDATE或
一个
DELETE语句。这里的主键意味着一个PRIMARY KEY或者UNIQUE没有列可以包含的
索引
NULL。
该变量可以有两个值:
1或者YES:仅发出警告(不是错误消息)。这是默认值。
0或者NO:禁止更新。
validate_password_
xxx
该validate_password插件实现了一组具有表单名称的系统变量
。这些变量影响该插件的密码测试; 请参见
第6.5.3.2节“密码验证插件选项和变量”。
validate_password_xxx
| 属性 | 值 |
|---|---|
| 系统变量 | validate_user_plugins |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 布尔 |
| 默认 | ON |
如果启用此变量(默认值),则服务器会检查每个用户帐户,并在发现可能导致帐户不可用的情况时生成警告:
该帐户需要一个未加载的身份验证插件。
该帐户需要
sha256_password身份验证插件,但服务器启动时既未启用SSL,也未启用此插件所需的RSA。
启用validate_user_plugins减慢服务器初始化和FLUSH PRIVILEGES。如果您不需要额外的检查,则可以在启动时禁用此变量以避免性能下降。
服务器的版本号。该值还可能包含指示服务器构建或配置信息的后缀。-log表示启用了一个或多个常规日志,慢速查询日志或二进制日志。-debug表示服务器是在启用调试支持的情况下构建的。
| 属性 | 值 |
|---|---|
| 系统变量 | version_comment |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
该CMake的配置程序有一个
COMPILATION_COMMENT选项,允许评论构建MySQL时指定。该变量包含该评论的值。请参见
第2.9.4节“MySQL源配置选项”。
| 属性 | 值 |
|---|---|
| 系统变量 | version_compile_machine |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
服务器二进制文件的类型。
| 属性 | 值 |
|---|---|
| 系统变量 | version_compile_os |
| 范围 | 全球 |
| 动态 | 没有 |
| 类型 | 串 |
构建MySQL的操作系统的类型。
| 属性 | 值 |
|---|---|
| 命令行格式 | --wait-timeout=# |
| 系统变量 | wait_timeout |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型(其他) | 整数 |
| 类型(Windows) | 整数 |
| 默认(其他) | 28800 |
| 默认(Windows) | 28800 |
| 最小(其他) | 1 |
| 最小(Windows) | 1 |
| 最大(其他) | 31536000 |
| 最大(Windows) | 2147483 |
服务器在关闭之前等待非交互式连接上的活动的秒数。
在线程启动时,会话
wait_timeout值由全局wait_timeout值或全局值
初始化
interactive_timeout,具体取决于客户端的类型(由CLIENT_INTERACTIVEconnect选项
定义
mysql_real_connect())。另见interactive_timeout。
由生成消息的最后一条语句导致的错误,警告和注释的数量。这个变量是只读的。请参见第13.7.5.40节“SHOW WARNINGS Syntax”。
MySQL服务器维护许多系统变量,指出它如何配置。第5.1.5节“服务器系统变量”描述了这些变量的含义。每个系统变量都有一个默认值。可以在服务器启动时使用命令行上的选项或选项文件来设置系统变量。它们中的大多数都可以在服务器通过SET
语句运行时动态更改
,这使您可以修改服务器的操作,而无需停止并重新启动它。您也可以在表达式中使用系统变量值。
有两个系统变量存在的范围。全局变量影响服务器的整体操作。会话变量影响其对各个客户端连接的操作。给定的系统变量可以同时具有全局值和会话值。全局和会话系统变量如下所示:
当服务器启动时,它将每个全局变量初始化为其默认值。这些默认值可以通过在命令行或选项文件中指定的选项来更改。(请参见 第4.2.3节“指定程序选项”。)
服务器还为每个连接的客户端维护一组会话变量。客户端的会话变量在连接时使用相应全局变量的当前值进行初始化。例如,客户端的SQL模式由会话sql_mode值控制,该
值在客户端连接到全局sql_mode值的值时被初始化。
对于某些系统变量,会话值不是从相应的全局值初始化的; 如果是这样,则在变量描述中指出。
通过使用命令行或选项文件中的选项,可以在服务器启动时全局设置系统变量值。当您使用启动选项设置采用数字值的变量时,可以使用后缀“ K,
M”或G(大写或小写)给出该值,以表示倍数1024,1024 2或1024 3 ; 即分别为千字节,兆字节或千兆字节的单位。因此,以下命令以InnoDB16兆字节的日志文件大小和1千兆字节的最大数据包大小启动服务器:
mysqld --innodb_log_file_size = 16M --max_allowed_packet = 1G
在选项文件中,这些变量是这样设置的:
的[mysqld] innodb_log_file_size = 16M max_allowed_packet的= 1G
后缀字母的信箱无关紧要;
16M和16m是等价的,因为是1G和1g。
要限制在运行时可以用SET
语句设置系统变量的
最大值,请使用
服务器启动时表单的选项指定此最大值
。例如,要防止在运行时增加值
超过32MB,请使用该选项
。
--maximum-var_name=valueinnodb_log_file_size--maximum-innodb_log_file_size=32M
许多系统变量都是动态的,可以在运行时通过使用SET
语句来更改
。有关列表,请参见
第5.1.6.2节“动态系统变量”。要更改系统变量
SET,请按名称引用它,可选地在前面加上一个修饰符:
要指出一个变量是一个全局变量,在其名称前面加上GLOBAL关键字或
@@global.限定符:
SET GLOBAL max_connections = 1000; SET @@ global.max_connections = 1000;
该SUPER特权是设置全局变量所必需的。
要指出变量是会话变量,请在其名称前面加上SESSION关键字或者
@@session.或者@@
限定符:
SET SESSION sql_mode ='TRADITIONAL'; SET @@ session.sql_mode ='TRADITIONAL'; SET @@ sql_mode ='TRADITIONAL';
设置会话变量通常不需要特殊权限,但有例外情况需要
SUPER特权(如
sql_log_bin)。客户端可以更改自己的会话变量,但不能更改其他客户端的会话变量。
LOCAL并且@@local.是同义词SESSION和
@@session.。
如果不存在修饰符,则
SET
更改会话变量。
在这些情况下发生错误:
在设置仅具有会话值的变量时
使用SET
GLOBAL(或@@global.):
MySQL的> SET GLOBAL sql_log_bin = ON;
错误1231(42000):变量'sql_log_bin'不能
设置为'ON'的值
在设置仅具有全局值的变量时
省略GLOBAL(或
@@global.):
MySQL的> SET max_connections = 1000;
错误1229(HY000):变量'max_connections'是a
GLOBAL变量,并且应该使用SET GLOBAL进行设置
在设置仅具有全局值的变量时
使用SET
SESSION(或@@SESSION.):
MySQL的> SET SESSION max_connections = 1000;
错误1229(HY000):变量'max_connections'是a
GLOBAL变量,并且应该使用SET GLOBAL进行设置
前面的修饰符只适用于系统变量。尝试将它们应用于用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。
一个SET
语句可以包含多个变量赋值,用逗号分隔。该语句将值分配给用户定义的变量和系统变量:
SET @x = 1,SESSION sql_mode ='';
如果设置了多个系统变量,则语句中最近的
GLOBAL或SESSION修饰符用于未指定修饰符的后续赋值。
多变量赋值的例子:
SET GLOBAL sort_buffer_size = 1000000,SESSION sort_buffer_size = 1000000; SET @@ global.sort_buffer_size = 1000000,@@ local.sort_buffer_size = 1000000; SET GLOBAL max_connections = 1000,sort_buffer_size = 1000000;
如果语句中的任何变量赋值
SET
失败,则整个语句失败并且不会更改变量。
如果更改了会话系统变量,则该值将在会话中保持有效,直到您将变量更改为不同的值或会话结束。该更改对其他会话没有影响。
如果更改全局系统变量,则会将该值记住并用于新会话,直到将该变量更改为其他值或服务器退出。任何访问全局变量的客户端都可以看到该更改。但是,更改仅影响更改后连接的客户端的相应会话变量。全局变量更改不影响任何当前客户端会话的会话变量(甚至不包括SET GLOBAL
发生该语句的会话
)。
要使全局系统变量设置为永久性的,以便它适用于跨服务器重新启动,则还应将其设置为选项文件。
要将GLOBAL编译的MySQL默认值或SESSION变量的GLOBAL值设置为当前对应值,请将变量设置为该值DEFAULT。例如,以下两个语句在将会话值设置max_join_size为当前全局值时是相同的:
SET @@ session.max_join_size = DEFAULT; SET @@ session.max_join_size = @@ global.max_join_size;
并非所有系统变量都可以设置为DEFAULT。在这种情况下,将DEFAULT结果分配给错误。
尝试分配DEFAULT
给用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。
要在表达式中引用系统变量的值,请使用其中一个@@-modifiers。例如,您可以SELECT
像这样在一个语句中检索值:
SELECT @@ global.sql_mode,@@ session.sql_mode,@@ sql_mode;
为了引用表达式中的系统变量
(而不是or
),MySQL会返回会话值(如果存在的话),否则返回全局值。这不同于
,它总是指会话值。
@@var_name@@global.@@session.SET @@var_name =
expr
在服务器启动时设置变量时,可以使用用于指定值乘数的后缀,但不要SET
在运行时设置值。另一方面,
SET您可以使用表达式分配变量的值,当您在服务器启动时设置变量时,这不是真的。例如,下列第一行在服务器启动时是合法的,但第二行不是:
shell>mysql --max_allowed_packet=16Mshell>mysql --max_allowed_packet=16*1024*1024
相反,下面的第二行在运行时是合法的,但第一行不是:
mysql>SET GLOBAL max_allowed_packet=16M;mysql>SET GLOBAL max_allowed_packet=16*1024*1024;
某些系统变量可以SET
通过将它们设置为ON或
来启用
语句1,或者通过将它们设置为OFF或来禁用它们
0。但是,要在命令行或选项文件中设置此类变量,必须将其设置为1或0; 设置它ON或OFF
不会工作。例如,在命令行上,
--delay_key_write=1工作但
--delay_key_write=ON没有。
要显示系统变量名称和值,请使用以下
SHOW VARIABLES语句:
MySQL的> SHOW VARIABLES;
+ --------------------------------- + --------------- -------------------- +
| 变量名| 值|
+ --------------------------------- + --------------- -------------------- +
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
| back_log | 50 |
| basedir | / home / mysql / |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | 二进制|
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | / home / mysql / share / mysql / charsets / |
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
...
| innodb_autoextend_increment | 8 |
| innodb_buffer_pool_size | 8388608 |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
...
| 版本| 5.7.18-log |
| version_comment | 来源分布|
| version_compile_machine | i686 |
| version_compile_os | suse-linux |
| wait_timeout | 28800 |
+ --------------------------------- + --------------- -------------------- +
使用LIKE子句时,语句仅显示与模式匹配的变量。要获取特定的变量名称,请使用LIKE
如下所示的子句:
SHOW VARIABLES LIKE'max_join_size'; SHOW SESSION VARIABLES like'max_join_size';
要获取名称与模式匹配的变量列表,请%在LIKE子句中使用
通配符
:
SHOW VARIABLES LIKE'%size%'; 显示全局变量,如'%size%';
通配符可以在要匹配的模式中的任何位置使用。严格地说,因为_是一个匹配任何单个字符的通配符,所以您应该将其转义为\_与字面匹配。在实践中,这很少需要。
因为SHOW VARIABLES,如果你既不指定GLOBAL也不SESSION返回SESSION值。
GLOBAL在设置GLOBAL-only变量时
要求使用关键字的原因是,在检索它们时不要使用关键字以防止将来出现问题:
如果我们要删除一个与SESSION变量名称相同的GLOBAL变量,具有该SUPER特权的客户端可能会意外地更改该GLOBAL
变量,而不是仅用SESSION
于其自身连接的变量。
如果我们要添加一个SESSION与变量名称相同的GLOBAL变量,那么打算更改该GLOBAL变量的客户端可能只会找到自己的SESSION变量。
结构化变量在两个方面与常规系统变量不同:
它的值是一个包含组件的结构,这些组件指定被认为密切相关的服务器参数。
可能有几个给定类型的结构化变量的实例。每个人都有不同的名称,并且指的是由服务器维护的不同资源。
MySQL支持一种结构化变量类型,它指定了控制键缓存操作的参数。密钥缓存结构化变量具有以下组件:
本节介绍用于引用结构变量的语法。密钥缓存变量用于语法示例,但关于密钥缓存如何操作的具体细节可在第8.10.2节“MyISAM密钥缓存”的其他位置找到。
要引用结构化变量实例的组件,可以使用instance_name.component_name格式化合物名称
。例子:
hot_cache.key_buffer_size hot_cache.key_cache_block_size cold_cache.key_cache_block_size
对于每个结构化系统变量,名称为的实例default始终是预定义的。如果您引用没有任何实例名称的结构化变量的组件,default则使用该实例。因此,
default.key_buffer_size与
key_buffer_size这两个指代相同的系统变量。
结构化变量实例和组件遵循以下命名规则:
对于给定类型的结构化变量,每个实例必须具有在
该类型的变量中唯一的名称。但是,实例名称在结构变量类型中不必是唯一的。例如,每个结构化变量都有一个名为的实例default,所以
default在变量类型中不是唯一的。
每个结构化变量类型的组件名称在所有系统变量名称中必须是唯一的。如果这不是真的(即,如果两种不同类型的结构变量可以共享组件成员名称),那么将不清楚哪个默认结构变量用于引用不受实例名称限定的成员名称。
如果结构化变量实例名称与非引用标识符不合法,请使用反引号将其引用为带引号的标识符。例如,hot-cache
不合法,但是`hot-cache`。
global,session并且
local不是合法的实例名称。这避免了与记号的冲突,例如
引用非结构化系统变量。
@@global.var_name
目前,前两条规则不可能被违反,因为唯一的结构化变量类型是用于键缓存的。如果将来会创建一些其他类型的结构化变量,这些规则将具有更大的意义。
除了一个例外,您可以在任何可能出现简单变量名称的上下文中使用复合名称来引用结构化变量组件。例如,您可以使用命令行选项将值分配给结构化变量:
外壳> mysqld --hot_cache.key_buffer_size=64K
在选项文件中,使用以下语法:
的[mysqld] hot_cache.key_buffer_size = 64K
如果使用此选项启动服务器,hot_cache除默认大小为8MB的默认密钥缓存外,它还会创建一个大小为64KB的密钥缓存。
假设您按如下方式启动服务器:
外壳>mysqld --key_buffer_size=256K \--extra_cache.key_buffer_size=128K \--extra_cache.key_cache_block_size=2048
在这种情况下,服务器将默认密钥缓存的大小设置为256KB。(您也可以写入
--default.key_buffer_size=256K)。另外,服务器创建一个名为extra_cache大小为128KB 的第二个键缓存
,缓存表索引块的块缓冲区大小设置为2048字节。
以下示例使用三个不同大小的3:1比例的密钥缓存启动服务器:
外壳>mysqld --key_buffer_size=6M \--hot_cache.key_buffer_size=2M \--cold_cache.key_buffer_size=2M
结构化变量值也可以在运行时设置和检索。例如,要设置一个名为hot_cache大小为10MB 的密钥缓存
,请使用以下任一语句:
mysql>SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024;mysql>SET @@global.hot_cache.key_buffer_size = 10*1024*1024;
要检索缓存大小,请执行以下操作:
MySQL的> SELECT @@global.hot_cache.key_buffer_size;
但是,以下声明不起作用。该变量不被解释为复合名称,而是作为LIKE模式匹配操作的简单字符串
:
MySQL的> SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';
这是能够在任何可能发生简单变量名的地方使用结构化变量名的例外。
许多服务器系统变量是动态的,可以在运行时使用SET
GLOBAL或
设置SET
SESSION。您也可以使用获取它们的值
SELECT。参见
第5.1.6节“使用系统变量”。
下表显示了所有动态系统变量的完整列表。最后一列表示每个变量是
GLOBAL或SESSION(或两者)适用。该表还列出了可以使用该SET
语句设置的会话选项
。第5.1.5节“服务器系统变量”讨论了这些选项。
具有“ 字符串 ”类型的变量需要一个字符串值。具有“ 数字 ”类型的变量
需要一个数字值。具有一个类型的变量“ 布尔 ”可以被设置为0,1,
ON或OFF。通常应将标记为“ 枚举 ”的变量设置为变量的可用值之一,但也可将其设置为与所需枚举值相对应的编号。对于枚举的系统变量,第一个枚举值对应于0.这不同于
ENUM 列,第一个枚举值对应于1。
表5.3动态变量摘要
MySQL服务器维护许多状态变量,提供有关其操作的信息。您可以使用SHOW [GLOBAL | SESSION]
STATUS语句查看这些变量及其值(请参见第13.7.5.35节“SHOW STATUS语法”)。可选GLOBAL关键字聚合所有连接上SESSION的值,并显示当前连接的值。
MySQL的> SHOW GLOBAL STATUS;
+ ----------------------------------- + ------------ +
| 变量名| 值|
+ ----------------------------------- + ------------ +
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Bytes_received | 155372598 |
| Bytes_sent | 1176560426 |
...
| 连接| 30023 |
| Created_tmp_disk_tables | 0 |
| Created_tmp_files | 3 |
| Created_tmp_tables | 2 |
...
| Threads_created | 217 |
| Threads_running | 88 |
| 正常运行时间| 1389872 |
+ ----------------------------------- + ------------ +
几个状态变量提供语句计数。要确定执行的语句数量,请使用以下关系:
SUM(Com_xxx)+ Qcache_hits =存储程序中执行的Questions +语句 =查询
FLUSH STATUS语句
将许多状态变量重置为0
。
下表列出了所有可用的服务器状态变量:
表5.4状态变量摘要
状态变量具有以下列表中所示的含义。关于特定于NDB簇的状态变量的含义,请参见第21.3.3.9.3节“NDB簇状态变量”。
由于客户端没有正确关闭连接而中止的连接数。参见 第B.5.2.10节“通信错误和中止的连接”。
尝试连接到MySQL服务器失败的次数。参见第B.5.2.10节“通信错误和中止的连接”。
有关其他连接相关信息,请检查
状态变量和
表格。
Connection_errors_xxxhost_cache
从MySQL 5.7.3开始,
Aborted_connects在嵌入式服务器中不可见,因为对于该服务器,它不会更新并且没有意义。
使用临时二进制日志高速缓存但超过临时二进制日志高速缓存的值
binlog_cache_size并使用临时文件存储事务语句的事务数。
在Binlog_stmt_cache_disk_use
状态变量中分别跟踪导致二进制日志事务高速缓存写入磁盘的非事务语句的数量
。
使用二进制日志缓存的事务数量。
使用二进制日志语句缓存但超过值的binlog_stmt_cache_size临时文件来存储这些语句的非事务语句的数量
。
使用二进制日志语句高速缓存的非事务语句的数量。
从所有客户端收到的字节数。
发送到所有客户端的字节数。
该
声明计数器变量指示次,每次数量
语句已被执行。每种类型的语句都有一个状态变量。例如,和
计数
和
分别发言。和
相似但申请
和
使用多表语法语句。
Com_xxxxxxCom_deleteCom_updateDELETEUPDATECom_delete_multiCom_update_multiDELETEUPDATE
如果查询缓存返回查询结果,则服务器将增加Qcache_hits
状态变量,而不是Com_select。请参见
第8.10.3.4节“查询缓存状态和维护”。
本节开头的讨论指出了如何将这些语句计数状态变量与其他此类变量关联起来。
即使准备好的语句参数未知或执行期间发生错误,
所有
变量也会增加。换句话说,它们的值对应于发出的请求数量,而不是成功完成的请求数量。
Com_stmt_xxx
该
状态变量如下:
Com_stmt_xxx
Com_stmt_prepare
Com_stmt_execute
Com_stmt_fetch
Com_stmt_send_long_data
Com_stmt_reset
Com_stmt_close
这些变量代表准备好的语句命令。他们的名字是指在网络层中使用的
命令集。换句话说,只要准备好的语句API调用(如mysql_stmt_prepare(),
mysql_stmt_execute()等被执行,它们的值就会增加
。然而,
并且
也增加
,
或
分别。此外,旧的声明计数器变量的值,
以及
增加对
,
和
COM_xxxCom_stmt_prepareCom_stmt_executeCom_stmt_closePREPAREEXECUTEDEALLOCATE PREPARECom_prepare_sqlCom_execute_sqlCom_dealloc_sqlPREPAREEXECUTEDEALLOCATE PREPARE声明。
Com_stmt_fetch代表从游标提取时发出的网络往返总次数。
Com_stmt_reprepare表示在元数据更改为由语句引用的表或视图之后,服务器自动重新声明的次数。代表操作增加
Com_stmt_reprepare,也是
Com_stmt_prepare。
Com_explain_other表示EXPLAIN FOR
CONNECTION执行的语句数量
。请参见
第8.8.4节“获取命名连接的执行计划信息”。它是在MySQL 5.7.2中引入的。
Com_change_repl_filter表示CHANGE REPLICATION FILTER
执行的语句数量。它是在MySQL 5.7.3中引入的。
客户端连接是否在客户端/服务器协议中使用压缩。
这些变量提供有关客户端连接过程中发生的错误的信息。它们仅是全局性的,表示来自所有主机的连接汇总的错误计数。这些变量跟踪主机缓存未考虑的错误(请参见第8.12.5.2节“DNS查找优化和主机缓存”),例如与TCP连接无关的错误,在连接过程中很早发生(甚至在IP地址是已知的),或者不特定于任何特定的IP地址(例如内存不足的情况)。
从MySQL 5.7.3开始,
状态变量在嵌入式服务器中不可见,因为对于该服务器它们不会更新并且没有意义。
Connection_errors_xxx
accept()在侦听端口上
调用期间发生的错误数量
。
由于服务器内部错误(例如未能启动新线程或内存不足条件)而拒绝的连接数。
Connection_errors_max_connections
由于max_connections达到了服务器限制,连接数被拒绝
。
Connection_errors_peer_address
搜索连接客户端IP地址时发生的错误数量。
在侦听端口上select()或poll()侦听端口上
发生的错误数量
。(此操作失败并不一定意味着客户端连接被拒绝。)
libwrap库
拒绝连接的数量
。
连接尝试(成功与否)到MySQL服务器的数量。
执行语句时由服务器创建的内部磁盘临时表的数量。
如果内部临时表最初是作为内存表创建的,但是变得太大,MySQL会自动将其转换为磁盘上的表。内存中临时表的最大大小是tmp_table_size和
max_heap_table_size值的最小值
。如果Created_tmp_disk_tables
很大,可能需要增加
tmp_table_size或
max_heap_table_size减少内存中内部临时表转换为磁盘表的可能性。
您可以将创建的内部磁盘临时表的数量与通过比较Created_tmp_disk_tables和
Created_tmp_tables
变量的值创建的内部临时表的总数进行比较
。
mysqld创建了 多少个临时文件。
执行语句时由服务器创建的内部临时表的数量。
您可以将创建的内部磁盘临时表的数量与通过比较Created_tmp_disk_tables和
Created_tmp_tables
变量的值创建的内部临时表的总数进行比较
。
SHOW
STATUS语句的
每次调用都使用一个内部临时表并增加全局
Created_tmp_tables值。
此状态变量已被弃用(因为
DELAYED不支持插入),并将在未来版本中删除。
此状态变量已被弃用(因为
DELAYED不支持插入),并将在未来版本中删除。
此状态变量已被弃用(因为
DELAYED不支持插入),并将在未来版本中删除。
服务器刷新表的次数,无论是由于用户执行FLUSH TABLES
语句还是由于内部服务器操作。它也会通过接收COM_REFRESH
数据包而增加。这是相反的
Com_flush,这表明了多少FLUSH报表已经执行,而不管FLUSH
TABLES,FLUSH LOGS等。
内部COMMIT
报表的数量。
行已从表中删除的次数。
服务器为每个对其external_lock()函数的调用递增该变量
,这通常发生在访问表实例的开始和结束处。存储引擎之间可能存在差异。例如,可以使用此变量来发现访问分区表的语句在锁定发生之前修剪了多少个分区:检查计数器为该语句增加了多少,减去2(对表本身调用2次),然后除以2以获得锁定的分区数量。
服务器使用存储引擎自己的多范围读取实施进行表访问的次数。
两阶段提交操作准备阶段的计数器。
索引中第一个条目被读取的次数。如果此值很高,则表明服务器正在执行大量完整索引扫描; 例如,SELECT col1 FROM
foo假设col1索引。
基于密钥读取行的请求数。如果此值很高,则表明您的表格已针对您的查询进行了适当的索引。
读取索引中最后一个键的请求数。随着
ORDER BY,服务器将发出一个第一密钥请求,然后是几个下一个密钥请求,而
ORDER BY DESC服务器将发出一个最后一个密钥请求,然后是几个先前密钥请求。
按键顺序读取下一行的请求数。如果您使用范围约束查询索引列或正在执行索引扫描,则此值会递增。
按键顺序读取前一行的请求数。这种读取方法主要用于优化ORDER BY
... DESC。
基于固定位置读取行的请求数。如果您正在执行许多需要对结果进行排序的查询,则此值很高。您可能有很多需要MySQL扫描整个表的查询,或者您有没有正确使用密钥的联接。
数据文件中读取下一行的请求数。如果您正在进行大量的表扫描,则此值很高。一般而言,这表明您的表格未正确编制索引,或者您的查询未编写为利用您拥有的索引。
存储引擎执行回滚操作的请求数。
存储引擎放置保存点的请求数。
存储引擎回滚到保存点的请求数。
表中更新行的请求数。
在表中插入行的请求数。
该
Innodb_available_undo_logs
状态变量被弃用MySQL的19年7月5日,并会在将来的版本中删除。
可用InnoDB
回滚段的总数。补充
innodb_rollback_segments
系统变量,它定义了活动回滚段的数量。
一个回滚段总是驻留在系统表空间中,并且32个回滚段被保留以供临时表使用并驻留在临时表空间(ibtmp1)中。请参阅
临时表撤消日志。
如果启动具有32个或更少回滚段的MySQL实例,InnoDB仍然会将一个回滚段分配给系统表空间,将32个回滚段分配给临时表空间。在这种情况下,
Innodb_available_undo_logs即使使用较小的innodb_rollback_segments
值初始化实例,也会报告可用的回滚段
。
Innodb_buffer_pool_dump_status
记录缓冲池中保存
的页面的操作进度
,由或
的设置触发
。
InnoDB
innodb_buffer_pool_dump_at_shutdowninnodb_buffer_pool_dump_now
有关相关信息和示例,请参见 第14.6.3.8节“保存和恢复缓冲池状态”。
Innodb_buffer_pool_load_status
操作进度,
热身的
InnoDB
缓冲池由一组阅读页面
对应一个较早的时间点,通过设置触发
innodb_buffer_pool_load_at_startup
或
innodb_buffer_pool_load_now。如果操作引入了过多的开销,则可以通过设置来取消它
innodb_buffer_pool_load_abort。
有关相关信息和示例,请参见 第14.6.3.8节“保存和恢复缓冲池状态”。
包含数据
的InnoDB
缓冲池中的总字节数。该数字包括
脏和干净的页面。为了更准确的内存使用量的计算比
Innodb_buffer_pool_pages_data,当压缩表导致缓冲池持有不同大小的页面。
包含数据的
缓冲池中
的页数。该数字包括
脏和干净的页面。使用压缩表时,报告的
值可能大于
(错误号59550)。
InnoDB
Innodb_buffer_pool_pages_dataInnodb_buffer_pool_pages_total
Innodb_buffer_pool_bytes_dirty
缓冲池中脏页中的
当前总字节数
。为了更准确地计算内存使用量
,使用压缩表时会导致缓冲池保存不同大小的页面。
InnoDB
Innodb_buffer_pool_pages_dirty
Innodb_buffer_pool_pages_latched
锁定数页
的InnoDB
缓冲池。这些是当前正在读取或写入的页面,或者由于某些其他原因无法
刷新或删除的页面。计算这个变量是很昂贵的,所以只有UNIV_DEBUG
在服务器构建时定义系统时才可用。
数页的
InnoDB
缓冲池,因为它们已经被分配给管理开销,如都在忙着锁定行或
适应性的散列索引。该值也可以计算为
Innodb_buffer_pool_pages_total
-
Innodb_buffer_pool_pages_free
-
Innodb_buffer_pool_pages_data。使用压缩表时,
Innodb_buffer_pool_pages_misc
可能会报告超出界限的值(错误号59550)。
Innodb_buffer_pool_pages_total
InnoDB
缓冲池
的总大小,以
页为单位。使用
压缩表时,报告的
Innodb_buffer_pool_pages_data
值可能大于
Innodb_buffer_pool_pages_total
(错误#59550)
Innodb_buffer_pool_read_ahead_rnd
由...发起
的“ 随机 ”预读
的次数InnoDB。当查询以随机顺序扫描大部分表格时会发生这种情况。
Innodb_buffer_pool_read_requests
逻辑读取请求的数量。
InnoDB
从缓冲池无法满足
的逻辑读取次数,必须直接从磁盘读取。
Innodb_buffer_pool_resize_status
通过
动态设置
参数触发的动态
调整InnoDB
缓冲池大小的操作状态
innodb_buffer_pool_size。从MySQL 5.7.5开始,
innodb_buffer_pool_size
参数是动态的,它允许您在不重新启动服务器的情况下调整缓冲池的大小。请参阅
在线配置InnoDB缓冲池大小以获取相关信息。
通常情况下,写入InnoDB
缓冲池发生在后台。当InnoDB需要读取或创建页面并且没有可用的干净页面时,首先InnoDB刷新一些
脏页面并等待该操作完成。该计数器对这些等待的实例进行计数。如果
innodb_buffer_pool_size设置正确,该值应该很小。
Innodb_buffer_pool_write_requests
写入InnoDB
缓冲池的次数。
fsync()到目前为止
的操作次数。fsync()通话频率受innodb_flush_method
配置选项设置的影响
。
当前正在执行的fsync()
操作数量。fsync()通话频率受innodb_flush_method
配置选项设置的影响
。
当前正在读取的数目。
当前正在写入的数量。
自服务器启动以来读取的数据量(以字节为单位)。
数据读取的总数(操作系统文件读取)。
数据写入的总次数。
迄今为止写入的数据量,以字节为单位。
数页已写入 双写缓冲。请参见第14.12.1节“InnoDB磁盘I / O”。
已执行的双重写入操作的数量。请参见第14.12.1节“InnoDB磁盘I / O”。
指示服务器是否使用原子指令构建 。
对InnoDB
重做日志文件的物理写入次数。
InnoDB目前保存
的文件数量已打开。
数fsync()进行到写入
InnoDB 重做日志文件中。
对InnoDB
重做日志文件的挂起写入次数。
InnoDB页面大小(默认16KB)。许多值都以页面计算; 页面大小使它们可以很容易地转换为字节。
通过对InnoDB表进行操作而创建的页数
。
InnoDB
通过对InnoDB表进行操作
从缓冲池中读取的页数。
通过InnoDB表格操作写入的页面数量
。
当前由表上的操作等待
的行锁定数量InnoDB。
总的时间花在获取
行锁的
InnoDB表,以毫秒为单位。
的平均时间获取
行锁的
InnoDB表,以毫秒为单位。
最大时间获取
行锁的
InnoDB表,以毫秒为单位。
InnoDB
表上的
操作次数必须等待行锁定。
从InnoDB
表中删除的行数。
插入到InnoDB
表中的行数。
从InnoDB表中读取的行数。
InnoDB
表中
更新的行数。
Innodb_truncated_status_writes
从SHOW ENGINE
INNODB STATUS语句输出的次数已被截断。
MyISAM密钥缓存中已更改但尚未刷新到磁盘
的密钥块数量。
MyISAM
密钥缓存
中未使用的块的数量。您可以使用此值来确定正在使用多少密钥缓存; 看到的讨论
key_buffer_size在
第5.1.5节,“服务器系统变量”。
MyISAM密钥缓存
中使用的块的数量。该值是一个高水位标记,表示曾经使用过的块的最大数量。
从MyISAM密钥缓存中读取密钥块的请求数
。
密钥块从磁盘物理读取到
MyISAM密钥缓存中的次数。如果
Key_reads很大,那么你的key_buffer_size价值可能太小了。缓存缺失率可以计算为
Key_reads/ Key_read_requests。
将密钥块写入MyISAM密钥缓存的请求数
。
密钥块从MyISAM密钥缓存到磁盘的物理写入次数
。
由查询优化器计算出的最后编译查询的总成本。这对于比较同一查询的不同查询计划的成本很有用。默认值0表示尚未编译任何查询。默认值是0. Last_query_cost有会话范围。
Last_query_cost只能为简单的“ 扁平 ”
查询准确地计算
该值,而不能用复杂的查询(如带有子查询或查询的查询)
进行计算UNION。对于后者,该值设置为0。
查询优化器在前一个查询的执行计划构建中进行的迭代次数。
Last_query_cost有会话范围。
尝试连接到锁定的用户帐户的次数。有关帐户锁定和解锁的信息,请参见 第6.3.11节“用户帐户锁定”。
这个变量是在MySQL 5.7.6中添加的。
SELECT超出执行超时
的语句数。
SELECT设置了非零执行超时
的语句数。这包括包含非零
MAX_EXECUTION_TIME优化器提示的语句,以及不包含此类提示但在max_execution_time系统变量指示的超时值非零时执行的语句
。
SELECT尝试设置执行超时失败
的语句数。
这个变量Max_execution_time_exceeded
在MySQL 5.7.8中被重新命名
。
这个变量Max_execution_time_set在MySQL 5.7.8中被重新命名
。
这个变量Max_execution_time_set_failed
在MySQL 5.7.8中被重新命名
。
自服务器启动以来同时使用的最大连接数。
时间在其
Max_used_connections达到其当前值。这个变量是在MySQL 5.7.5中添加的。
此状态变量已被弃用(因为
DELAYED不支持插入),并将在未来版本中删除。
MeCab全文分析器插件当前使用的字符集。有关相关信息,请参见 第12.9.9节“MeCab全文解析器插件”。
Ongoing_anonymous_transaction_count
显示已标记为匿名的正在进行的交易的数量。这可以用来确保没有其他交易正在等待处理。这个变量是在MySQL 5.7.6中添加的。
Ongoing_anonymous_gtid_violating_transaction_count
此状态变量仅在调试版本中可用。显示正在使用gtid_next=ANONYMOUS并违反GTID一致性的正在进行的交易的数量
。
Ongoing_automatic_gtid_violating_transaction_count
此状态变量仅在调试版本中可用。显示正在使用gtid_next=AUTOMATIC并违反GTID一致性的正在进行的交易的数量
。
打开的文件数量。该计数包括由服务器打开的常规文件。它不包括其他类型的文件,例如套接字或管道。此外,计数不包括存储引擎使用自己的内部函数打开的文件,而不是要求服务器级别这样做。
打开的流的数量(主要用于日志记录)。
缓存.frm文件的数量。
打开的表的数量。
my_open()(mysys
库函数)
打开的文件数
。不使用此功能打开文件的服务器部件不会增加计数。
.frm已被缓存
的文件数量。
已打开的表的数量。如果
Opened_tables很大,你的
table_open_cache价值可能太小了。
Performance_schema_
xxx
性能模式状态变量在第25.15节“性能模式状态变量”中列出 。这些变量提供有关由于内存限制而无法加载或创建的检测的信息。
当前准备好的语句数量。(语句的最大数量由max_prepared_stmt_count
系统变量给出
。)
查询缓存中的空闲内存块的数量。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
Qcache_free_blocks。
查询缓存的可用内存量。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
Qcache_free_memory。
查询缓存命中的数量。
本节开始部分的讨论指出了如何将此语句计数状态变量与其他此类变量关联起来。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
Qcache_hits。
添加到查询缓存的查询数量。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
Qcache_inserts。
由于内存不足而从查询缓存中删除的查询数量。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
Qcache_lowmem_prunes。
非缓存查询的数量(不可缓存,或由于query_cache_type
设置而未缓存)。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
Qcache_not_cached。
查询缓存中注册的查询数量。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
Qcache_queries_in_cache。
查询缓存中的块的总数。
查询缓存从MySQL 5.7.20开始已弃用,并在MySQL 8.0中删除。弃用包括
Qcache_total_blocks。
服务器执行的语句数量。与Questions变量不同,此变量包含在存储程序中执行的语句。它不计数COM_PING或
COM_STATISTICS命令。
本节开始部分的讨论指出了如何将此语句计数状态变量与其他此类变量关联起来。
服务器执行的语句数量。这只包括客户端发送给服务器的语句,而不包括存储程序中执行的语句,与Queries变量不同
。这个变量不计COM_PING,
COM_STATISTICS,
COM_STMT_PREPARE,
COM_STMT_CLOSE,或
COM_STMT_RESET命令。
本节开始部分的讨论指出了如何将此语句计数状态变量与其他此类变量关联起来。
半同步从站的数量。
只有安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_net_avg_wait_time
主设备等待从设备回复的平均时间(以微秒为单位)。此变量始终不推荐使用,
0并且将在未来版本中删除。
只有安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_net_wait_time
主设备等待从设备回复的总时间(以微秒为单位)。此变量始终不推荐使用,
0并且将在未来版本中删除。
只有安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_net_waits
主机等待从机回复的总次数。
只有安装了主端半同步复制插件时,此变量才可用。
主设备关闭半同步复制的次数。
只有安装了主端半同步复制插件时,此变量才可用。
从机未成功确认的提交数量。
只有安装了主端半同步复制插件时,此变量才可用。
当前是否在主服务器上运行半同步复制。该值是ON如果插件已被启用并且已发生提交确认。这是OFF由于提交确认超时而导致插件未启用或主站已退回到异步复制。
只有安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_timefunc_failures
调用时间函数(例如,)时主设备失败的次数gettimeofday()。
只有安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_tx_avg_wait_time
主服务器等待每笔交易的平均时间(以微秒为单位)。
只有安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_tx_wait_time
主服务器等待事务的总时间(以微秒为单位)。
只有安装了主端半同步复制插件时,此变量才可用。
主要等待交易的总次数。
只有安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_wait_pos_backtraverse
主站等待二进制坐标低于先前等待的事件的总次数。当事务开始等待回复的顺序与其二进制日志事件的写入顺序不同时,可能会发生这种情况。
只有安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_wait_sessions
当前正在等待从属回复的会话数量。
只有安装了主端半同步复制插件时,此变量才可用。
从机成功确认的提交数量。
只有安装了主端半同步复制插件时,此变量才可用。
当前是否在从站上运行半同步复制。这是ON如果插件已启用且从属I / O线程正在运行,
OFF否则。
只有安装了从端半同步复制插件时,此变量才可用。
如果使用OpenSSL编译MySQL,则此变量可用(请参见第6.4.4节“OpenSSL与yaSSL”)。它的值是sha256_password
认证插件用于基于RSA密钥对的密码交换的公钥。该值不为空只在服务器初始化成功通过命名文件的私钥和公钥
sha256_password_private_key_path
和
sha256_password_public_key_path
系统变量。Rsa_public_key来自后一个文件的价值
。
有关信息sha256_password,请参见
第6.5.1.4节“SHA-256可插入验证”。
执行表扫描的连接数,因为它们不使用索引。如果此值不为0,则应仔细检查表格的索引。
在参考表上使用范围搜索的连接数。
在第一个表上使用范围的连接数。即使价值相当大,这通常不是一个关键问题。
没有密钥的联接数量,用于检查每行之后的密钥使用情况。如果这不是0,则应仔细检查表格的索引。
对第一个表进行全面扫描的连接数。
显示复制从服务器上的复制心跳间隔(以秒为单位)。
该变量受show_compatibility_56系统变量值的影响
。有关详细信息,请参阅
show_compatibility_56对从站状态变量的影响。
该变量仅显示默认复制通道的状态。要监视任何复制通道,请使用
表中的HEARTBEAT_INTERVAL列
replication_connection_status作为复制通道。
Slave_heartbeat_period已被弃用,并将在未来的MySQL版本中被删除。
显示复制从属设备收到最近一次心跳信号的时间
TIMESTAMP值。
该变量受show_compatibility_56系统变量值的影响
。有关详细信息,请参阅
show_compatibility_56对从站状态变量的影响。
该变量仅显示默认复制通道的状态。要监视任何复制通道,请使用
表中的LAST_HEARTBEAT_TIMESTAMP列
replication_connection_status作为复制通道。
Slave_last_heartbeat已被弃用,并将在未来的MySQL版本中被删除。
从属SQL线程当前打开的临时表的数量。如果该值大于零,则关闭从站是不安全的; 请参见 第16.4.1.30节“复制和临时表”。此变量报告所有复制通道的打开临时表的总数 。
自上次重新启动或重置从站或发出CHANGE
MASTER TO语句后,此计数器会随着复制从站收到的每个复制心跳而递增。
该变量受show_compatibility_56系统变量值的影响
。有关详细信息,请参阅
show_compatibility_56对从站状态变量的影响。
该变量仅显示默认复制通道的状态。要监视任何复制通道,请使用
表中的COUNT_RECEIVED_HEARTBEATS列
replication_connection_status作为复制通道。
Slave_received_heartbeats
已被弃用,并将在未来的MySQL版本中被删除。
自启动以来复制从属SQL线程重试事务的总次数。
该变量受show_compatibility_56系统变量值的影响
。有关详细信息,请参阅
show_compatibility_56对从站状态变量的影响。
该变量仅显示默认复制通道的状态。要监视任何复制通道,请使用
表中的COUNT_TRANSACTIONS_RETRIES列replication_applier_status作为复制通道。
Slave_retried_transactions
已被弃用,并将在未来的MySQL版本中被删除。
Slave_rows_last_search_algorithm_used
最近由该从服务器用于为基于行的复制定位行的搜索算法。结果显示从属使用索引,表扫描还是散列作为在任何通道上执行的最后一个事务的搜索算法。
使用的方法取决于slave_rows_search_algorithms
系统变量的设置
以及相关表格上可用的键。
这是ON如果此服务器是连接到复制主服务器的复制从服务器,并且I / O和SQL线程都正在运行; 否则,它是
OFF。
该变量受show_compatibility_56系统变量值的影响
。有关详细信息,请参阅
show_compatibility_56对从站状态变量的影响。
该变量仅显示默认复制通道的状态。要监视任何复制通道,请使用复制通道或多个
表中的SERVICE_STATE列
。
已被弃用,并将在未来的MySQL版本中被删除。
replication_applier_statusreplication_connection_statusSlave_running
slow_launch_time创建
时间超过几秒的线程数
。
这个变量在嵌入式服务器(libmysqld)中是没有意义的,因为MySQL 5.7.2在嵌入式服务器中不再可见。
查询的次数超过了
long_query_time几秒。无论是否启用慢查询日志,该计数器都会递增。有关该日志的信息,请参见
第5.4.5节“慢速查询日志”。
排序算法必须执行的合并过程的数量。如果这个值很大,你应该考虑增加sort_buffer_size
系统变量的值。
使用范围完成的排序数量。
排序的行数。
通过扫描表格完成的排序数量。
建立连接所需的谈判次数。
接受的SSL连接的数量。
回调缓存命中的数量。
当前加密密码(未加密连接为空)。
可能的SSL密码列表(对于非SSL连接为空)。
尝试启用SSL的主设备的SSL连接尝试次数。
建立到启用SSL的主站的连接所需的协商数目。
SSL上下文验证深度(测试链中有多少个证书)。
SSL上下文验证模式。
默认的SSL超时。
成功连接到服务器的SSL连接数。
成功启用SSL的主设备的从属连接数。
SSL证书有效的最后日期。要检查SSL证书到期信息,请使用以下语句:
MySQL的> SHOW STATUS LIKE 'Ssl_server_not%';
+ ----------------------- + ------------------------- - +
| 变量名| 值|
+ ----------------------- + ------------------------- - +
| Ssl_server_not_after | 4月28日14:16:39 2025 GMT |
| Ssl_server_not_before | 2015年5月1日14:16:39 GMT |
+ ----------------------- + ------------------------- - +
SSL证书有效的第一个日期。
SSL会话缓存命中的数量。
SSL会话缓存未命中的数量。
SSL会话缓存模式。
SSL会话缓存溢出的数量。
SSL会话缓存大小。
SSL会话缓存超时的数量。
从缓存中重用了多少SSL连接。
Ssl_used_session_cache_entries
使用了多少SSL会话缓存条目。
复制SSL连接的验证深度。
服务器用于使用SSL的连接的验证模式。该值是一个位掩码; 位在openssl/ssl.h头文件中定义
:
#define SSL_VERIFY_NONE 0x00 #定义SSL_VERIFY_PEER 0x01 #定义SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 #定义SSL_VERIFY_CLIENT_ONCE 0x04
SSL_VERIFY_PEER表示服务器要求提供客户端证书。如果客户端提供服务器,服务器将执行验证,并且只有验证成功时才会继续。SSL_VERIFY_CLIENT_ONCE
表示仅在初始握手期间完成对客户端证书的请求。
连接的SSL协议版本; 例如TLSv1。如果连接未加密,则该值为空。
可以立即授予表锁请求的次数。
无法立即授予表锁的请求并需要等待的次数。如果这是很高的并且您遇到性能问题,则应首先优化您的查询,然后拆分一个或多个表或使用复制。
打开表格缓存查找的命中数。
打开表格缓存查找未命中的次数。
打开表缓存的溢出次数。这是在打开或关闭表后,缓存实例具有未使用的条目并且实例的大小大于table_open_cache
/的次数table_open_cache_instances。
对于mysqld在用作恢复内部XA事务的事务协调器时所使用的日志的内存映射实现,此变量指示自服务器启动以来用于日志的最大页数。如果产品
Tc_log_max_pages_used和
Tc_log_page_size总是比日志大小显著少,尺寸大于必需的并且可以减小。(大小是由
--log-tc-size选项。此变量未使用:对于基于二进制日志的恢复而言,不需要该内存映射恢复日志方法,除非能够进行两阶段提交并且支持XA事务的存储引擎数量大于1,否则不会使用该方法。(InnoDB是唯一适用的引擎。)
用于XA恢复日志的内存映射实现的页面大小。默认值是使用确定的
getpagesize()。由于与上述相同的原因,此变量未使用
Tc_log_max_pages_used。
对于恢复日志的内存映射实现,每次服务器无法提交事务并且必须等待日志中的空闲页面时,此变量才会递增。如果此值很大,则可能需要增加日志大小(使用该
--log-tc-size选项)。对于基于二进制日志的恢复,每次二进制日志无法关闭时,此变量会递增,因为存在两阶段提交。(关闭操作等到所有这些交易完成。)
线程缓存中的线程数。
这个变量在嵌入式服务器(libmysqld)中是没有意义的,因为MySQL 5.7.2在嵌入式服务器中不再可见。
当前打开的连接数量。
为处理连接而创建的线程数。如果
Threads_created很大,你可能想增加
thread_cache_size价值。缓存缺失率可以计算为
Threads_created/ Connections。
未睡眠的线程数。
服务器启动的秒数。
自最近FLUSH
STATUS声明以来的秒数。
MySQL服务器可以在不同的SQL模式下运行,并且可以根据sql_mode系统变量的值对不同的客户端应用不同的模式。DBA可以设置全局SQL模式以匹配站点服务器操作要求,并且每个应用程序可以将其会话SQL模式设置为自己的要求。
模式会影响MySQL支持的SQL语法以及它执行的数据验证检查。这使得在不同的环境中使用MySQL更容易,并且可以将MySQL与其他数据库服务器一起使用。
有关MySQL中服务器SQL模式常见问题的答案,请参见第A.3节“MySQL 5.7 FAQ:服务器SQL模式”。
使用InnoDB表格时,请考虑innodb_strict_mode系统变量。它可以对InnoDB表进行额外的错误检查
。
在MySQL 5.7的默认SQL模式包括以下模式:ONLY_FULL_GROUP_BY,
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,和
NO_ENGINE_SUBSTITUTION。
这些模式被添加到MySQL 5.7中的默认SQL模式中:
ONLY_FULL_GROUP_BY和
STRICT_TRANS_TABLES模式被添加到MySQL 5.7.5中。该
NO_AUTO_CREATE_USER模式已添加到MySQL 5.7.7中。这些
ERROR_FOR_DIVISION_BY_ZERO,
NO_ZERO_DATE和
NO_ZERO_IN_DATE模式都是在MySQL 5.7.8中添加的。有关这些默认SQL模式值更改的更多讨论,请参阅
MySQL 5.7中的SQL模式更改。
要在服务器启动时设置SQL模式,请
在命令行或
选项文件(如Unix操作系统)或(Windows)中使用该
选项
。
是用逗号分隔的不同模式的列表。要明确清除SQL模式,请使用命令行或选项文件将其设置为空字符串
。
--sql-mode="modes"sql-mode="modes"my.cnfmy.inimodes--sql-mode=""sql-mode=""
MySQL安装程序可能会在安装过程中配置SQL模式。例如,
mysql_install_db将创建一个my.cnf在基本安装目录中指定的默认选项文件。该文件包含设置SQL模式的行; 请参见第4.4.2节“ mysql_install_db - 初始化MySQL数据目录”。
如果SQL模式与默认或预期不同,请检查服务器在启动时读取的选项文件中的设置。
要在运行时更改SQL模式,请sql_mode使用以下SET
语句设置全局或会话
系统变量:
SET GLOBAL sql_mode ='modes'; SET SESSION sql_mode ='modes';
设置GLOBAL变量需要
SUPER特权并影响从此时开始连接的所有客户端的操作。设置SESSION变量仅影响当前客户端。每个客户可以随时更改其会话
sql_mode值。
要确定当前的全局或会话
sql_mode设置,请选择其值:
SELECT @@ GLOBAL.sql_mode; SELECT @@ SESSION.sql_mode;
SQL模式和用户定义的分区。 创建数据并将其插入分区表后,更改服务器SQL模式可能会导致此类表的行为发生重大变化,并可能导致数据丢失或损坏。强烈建议您一旦创建了使用用户定义分区的表格,就不要更改SQL模式。
在复制分区表时,主站和从站上不同的SQL模式也会导致问题。为了获得最佳结果,您应始终在主服务器和从服务器上使用相同的服务器SQL模式。
有关更多信息,请参见 第22.6节“分区的限制和限制”。
最重要的sql_mode
价值可能是这些:
此模式更改语法和行为以更贴近地符合标准SQL。它是 本节末尾列出的特殊 组合模式之一。
如果无法将某个值插入到事务表中,请中止该语句。对于非事务性表,如果该值出现在单行语句或多行语句的第一行中,则放弃该语句。更多细节在本节后面给出。
从MySQL 5.7.5开始,默认的SQL模式包括
STRICT_TRANS_TABLES。
让MySQL像“ 传统 ” SQL数据库系统一样行事。在将不正确的值插入列时,此模式的简单描述是 “ 给出错误而不是警告 ”。它是本节末尾列出的特殊组合模式之一。
随着TRADITIONAL模式允许,INSERT或者
UPDATE只要发生错误中止。如果您使用的是非事务性存储引擎,则可能不是您想要的,因为在发生错误之前所做的数据更改可能无法回滚,从而导致“ 部分完成 ”更新。
当本手册引用“ 严格模式 ”时,它表示具有一种或两种STRICT_TRANS_TABLES或
STRICT_ALL_TABLES启用的模式
。
以下列表描述了所有支持的SQL模式:
不要执行完整的日期检查。仅检查月份是在1到12之间的范围内,并且日期在1到31之间的范围内。这对于在三个不同字段中获取年份,月份和日期的Web应用程序非常有用,并且可以准确存储用户插入,没有日期验证。此模式适用于
DATE和
DATETIME列。它不适用TIMESTAMP列,它总是需要有效的日期。
与ALLOW_INVALID_DATES
启用,服务器需要月份和日期值是合法的,而不是仅仅在范围为1〜12和1〜31,分别。在禁用严格模式的情况下,会生成无效日期(如'2004-04-31'转换为
'0000-00-00'和警告)。启用严格模式后,无效日期会生成错误。要允许这种日期,请启用
ALLOW_INVALID_DATES。
治疗"作为标识符引号字符(如`引号字符),而不是作为一个字符串引号字符。您仍然可以使用
`引用启用此模式的标识符。与ANSI_QUOTES
启用,则不能使用双引号,因为它们被解释为标识符引用文字字符串。
该
ERROR_FOR_DIVISION_BY_ZERO
模式影响零除的处理,其中包括
。对于数据更改操作(,
),其效果还取决于是否启用严格的SQL模式。
MOD(N,0)INSERTUPDATE
如果此模式未启用,则按零插入
NULL并不产生警告。
如果启用此模式,则除以零插入
NULL并产生警告。
如果启用了此模式和严格模式,则除以零除会产生错误,除非IGNORE
给出。对于INSERT IGNORE
和UPDATE IGNORE,除以零插入NULL并产生警告。
因为SELECT,除以零回报NULL。ERROR_FOR_DIVISION_BY_ZERO
无论是否启用严格模式,启用
都会导致产生警告。
ERROR_FOR_DIVISION_BY_ZERO
已弃用。
ERROR_FOR_DIVISION_BY_ZERO
不是严格模式的一部分,但应与严格模式配合使用,默认情况下处于启用状态。如果ERROR_FOR_DIVISION_BY_ZERO
在未启用严格模式的情况下启用警告,
反之亦然。有关其他讨论,请参阅
MySQL 5.7中的SQL模式更改。
因为
ERROR_FOR_DIVISION_BY_ZERO
已被弃用,它将作为单独的模式名称在未来的MySQL版本中删除,并且其效果包含在严格SQL模式的影响中。
NOT
运算符
的优先级是这样的表达式,如NOT a
BETWEEN b AND c解析为NOT (a
BETWEEN b AND c)。在一些旧版本的MySQL中,表达式被解析为(NOT a) BETWEEN b AND
c。通过启用HIGH_NOT_PRECEDENCESQL模式可以获得旧的高优先级行为
。
mysql>SET sql_mode = '';mysql>SELECT NOT 1 BETWEEN -5 AND 5;- > 0 mysql>SET sql_mode = 'HIGH_NOT_PRECEDENCE';mysql>SELECT NOT 1 BETWEEN -5 AND 5;- > 1
允许函数名称和(字符之间的空格
。这导致内置函数名称被视为保留字。因此,必须按照第9.2节“模式对象名称”中的描述引用与函数名称相同的标识符。例如,因为有一个
COUNT()函数,所以count在以下语句中使用
作为表名称会导致错误:
MySQL的> CREATE TABLE count (i INT);
错误1064(42000):您的SQL语法中有错误
表名应该引用:
MySQL的> CREATE TABLE `count` (i INT);
查询OK,0行受影响(0.00秒)
在IGNORE_SPACESQL模式适用于内置函数,而不是用户定义的函数或存储功能。无论是否IGNORE_SPACE启用,始终允许在UDF或存储的函数名称后面有空格
。
有关进一步讨论
IGNORE_SPACE,请参见
第9.2.4节“函数名称解析和解析”。
防止GRANT声明自动创建新的用户帐户,除非认证信息被指定。该声明必须使用IDENTIFIED BY或使用身份验证插件指定非空密码IDENTIFIED WITH。
最好创建MySQL帐户
CREATE USER而不是
GRANT。
NO_AUTO_CREATE_USER已弃用,默认的SQL模式包含在内
NO_AUTO_CREATE_USER。分配给sql_mode
该改变
NO_AUTO_CREATE_USER模式状态产生警告,除了设置分配
sql_mode到
DEFAULT。
NO_AUTO_CREATE_USER将在未来的MySQL版本中被删除,此时它的效果将始终启用(GRANT不会创建帐户)。
以前,NO_AUTO_CREATE_USER弃用之前
,不启用它的一个原因是它不是复制安全的。现在,它可以启用和进行复制,安全的用户管理CREATE USER IF NOT
EXISTS,DROP USER IF EXISTS和ALTER USER IF EXISTS而不是
GRANT。当从属服务器与主服务器上的授权可能有不同的授权时,这些语句启用安全复制。请参见第13.7.1.2节“创建用户语法”,
第13.7.1.3节“DROP USER语法”和
第13.7.1.1节“ALTER USER语法”。
NO_AUTO_VALUE_ON_ZERO
影响AUTO_INCREMENT
列的处理。通常情况下,您通过插入NULL或
插入列来生成列的下一个序列号0。
NO_AUTO_VALUE_ON_ZERO
为了0只NULL产生下一个序列号而抑制这种行为。
如果0已经存储在表格的AUTO_INCREMENT
列中,此模式会很有用。(0顺便提一下,存储不是推荐的做法。)例如,如果您使用mysqldump转储表并重新加载它,MySQL通常会在遇到0值时生成新的序列号,从而导致与内容不同的表被倾销。NO_AUTO_VALUE_ON_ZERO
重新加载转储文件之前启用
解决此问题。出于这个原因,mysqldump会在其输出中自动包含一个使能的语句
NO_AUTO_VALUE_ON_ZERO。
禁用反斜杠字符(\)作为字符串内的转义字符。启用此模式后,反斜杠将变成与其他任何其他类似的普通字符。
创建表格时,忽略所有INDEX
DIRECTORY和DATA DIRECTORY
指令。该选项在从属复制服务器上很有用。
控制默认存储引擎的自动替换,例如CREATE
TABLE或者ALTER
TABLE指定禁用或未编译的存储引擎。
默认情况下,
NO_ENGINE_SUBSTITUTION已启用。
由于存储引擎在运行时可以插入,因此不可用的引擎也会以同样的方式处理:
如果
NO_ENGINE_SUBSTITUTION
禁用,CREATE TABLE
则使用默认引擎,如果所需引擎不可用,则会发生警告。因为
ALTER TABLE,发生警告并且表格未被更改。
与
NO_ENGINE_SUBSTITUTION
启用,则会出现错误,并且不会创建或修改的表,如果所需的引擎不可用。
不要在输出中打印MySQL特定的列选项
SHOW CREATE TABLE。这种模式在可移植性模式下由mysqldump使用。
从MySQL 5.7.22开始,
NO_FIELD_OPTIONS已被弃用。它将在未来版本的MySQL中被删除。
不要在输出中打印MySQL特定的索引选项
SHOW CREATE TABLE。这种模式在可移植性模式下由mysqldump使用。
从MySQL 5.7.22开始,
NO_KEY_OPTIONS已被弃用。它将在未来版本的MySQL中被删除。
不要ENGINE在输出中打印MySQL特定的表选项(如
)
SHOW CREATE TABLE。这种模式在可移植性模式下由mysqldump使用。
从MySQL 5.7.22开始,
NO_TABLE_OPTIONS已被弃用。它将在未来版本的MySQL中被删除。
整数值之间的减法(其中一个是类型的
UNSIGNED)会默认生成无符号结果。如果结果是否定的,则会出现错误:
MySQL的>SET sql_mode = '';查询OK,0行受影响(0.00秒) mysql> ERROR 1690(22003):BIGINT UNSIGNED值在'(cast(0 as unsigned) - 1)'SELECT CAST(0 AS UNSIGNED) - 1;
如果NO_UNSIGNED_SUBTRACTION
启用了
SQL模式,结果是否定的:
mysql>SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';mysql>SELECT CAST(0 AS UNSIGNED) - 1;+ ------------------------- + | CAST(0 AS UNSIGNED) - 1 | + ------------------------- + | -1 | + ------------------------- +
如果此操作的结果用于更新
UNSIGNED整数列,则结果将被剪裁为列类型的最大值,如果NO_UNSIGNED_SUBTRACTION启用,则剪切为0
。如果启用严格的SQL模式,则会发生错误并且列保持不变。
当
NO_UNSIGNED_SUBTRACTION启用时,即使任何操作数无符号,减法结果也是有符号的。例如,比较列的类型c2在表
t1与该列的
c2表t2:
mysql>SET sql_mode='';mysql>CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);mysql>CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;mysql>DESCRIBE t1;+ ------- + --------------------- + ------ + ----- + ------ --- + ------- + | 字段| 类型| 空| Key | 默认| 额外| + ------- + --------------------- + ------ + ----- + ------ --- + ------- + | c2 | bigint(21)unsigned | NO | | 0 | | + ------- + --------------------- + ------ + ----- + ------ --- + ------- + mysql>SET sql_mode='NO_UNSIGNED_SUBTRACTION';mysql>CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;mysql>DESCRIBE t2;+ ------- + ------------ + ------ + ------ + --------- + ----- - + | 字段| 类型| 空| Key | 默认| 额外| + ------- + ------------ + ------ + ------ + --------- + ----- - + | c2 | bigint(21)| NO | | 0 | | + ------- + ------------ + ------ + ------ + --------- + ----- - +
这意味着BIGINT UNSIGNED在所有情况下都不是100%可用。请参见
第12.10节“演算函数和操作符”。
该NO_ZERO_DATE模式影响服务器是否允许
'0000-00-00'作为有效日期。其效果也取决于是否启用严格的SQL模式。
如果此模式未启用,
'0000-00-00'则允许插入并且不会产生警告。
如果启用此模式,'0000-00-00'
则允许并插入产生警告。
如果启用了此模式和严格模式,
'0000-00-00'则不允许插入并且插入会产生错误,除非
IGNORE给出。为
INSERT IGNORE和UPDATE
IGNORE,'0000-00-00'被允许和插入产生警告。
NO_ZERO_DATE已弃用。NO_ZERO_DATE
不是严格模式的一部分,但应与严格模式配合使用,默认情况下处于启用状态。如果NO_ZERO_DATE在未启用严格模式的情况下启用警告,
反之亦然。有关其他讨论,请参阅
MySQL 5.7中的SQL模式更改。
因为NO_ZERO_DATE已被弃用,它将在未来的MySQL版本中作为单独的模式名称被删除,其效果包含在严格SQL模式的效果中。
该NO_ZERO_IN_DATE模式会影响服务器是否允许年份不为零,但月份或日期部分为0的日期(此模式影响日期,例如'2010-00-01'或
'2010-01-00',但不是
'0000-00-00'。要控制服务器是否允许'0000-00-00',请使用该
NO_ZERO_DATE模式。)影响的NO_ZERO_IN_DATE
还取决于是否启用严格的SQL模式。
如果未启用此模式,则允许零部件的日期,并且插入不会产生警告。
如果启用此模式,则将零件的日期插入'0000-00-00'并产生警告。
如果启用了此模式和严格模式,则不允许带有零部件的日期,插入会产生错误,除非IGNORE给出。对于INSERT IGNORE和
UPDATE IGNORE,具有零部件的日期被插入'0000-00-00'并产生警告。
NO_ZERO_IN_DATE已弃用。
NO_ZERO_IN_DATE不是严格模式的一部分,但应与严格模式配合使用,默认情况下处于启用状态。如果NO_ZERO_IN_DATE在未启用严格模式的情况下启用警告,
反之亦然。有关其他讨论,请参阅
MySQL 5.7中的SQL模式更改。
因为NO_ZERO_IN_DATE已被弃用,它将在未来的MySQL版本中作为单独的模式名称被删除,其效果包含在严格SQL模式的效果中。
拒绝对选择列表,
HAVING条件或ORDER
BY列表引用既未在GROUP BY子句中命名也未在功能上依赖(由GROUP BY列唯一确定)的非
聚合列的查询。
从MySQL 5.7.5开始,默认的SQL模式包括
ONLY_FULL_GROUP_BY。(在5.7.5之前,MySQL没有检测到函数依赖关系,并且ONLY_FULL_GROUP_BY默认情况下未启用。关于5.7.5之前的行为描述,请参阅MySQL 5.6参考手册。)
对标准SQL的MySQL扩展允许在HAVING子句中引用
选择列表中的别名表达式。在MySQL 5.7.5之前,启用
ONLY_FULL_GROUP_BY
禁用这个扩展,因此需要
HAVING使用非混淆表达式来写入子句。从MySQL 5.7.5开始,解除了这个限制,这样HAVING子句可以引用别名,而不管是否
ONLY_FULL_GROUP_BY启用。
有关其他讨论和示例,请参见 第12.19.3节“MySQL处理GROUP BY”。
默认情况下,尾部空格CHAR在检索时从列值中删除
。如果
PAD_CHAR_TO_FULL_LENGTH启用,则不会发生修剪,并将检索
CHAR值填充到全长。此模式不适
VARCHAR用于在检索时保留尾部空格的列。
MySQL的>CREATE TABLE t1 (c1 CHAR(10));查询OK,0行受影响(0.37秒) MySQL的>INSERT INTO t1 (c1) VALUES('xy');查询OK,1行受影响(0.01秒) MySQL的>SET sql_mode = '';查询OK,0行受影响(0.00秒) MySQL的>SELECT c1, CHAR_LENGTH(c1) FROM t1;+ ------ + ----------------- + | c1 | CHAR_LENGTH(c1)| + ------ + ----------------- + | xy | 2 | + ------ + ----------------- + 一排(0.00秒) MySQL的>SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';查询OK,0行受影响(0.00秒) MySQL的>SELECT c1, CHAR_LENGTH(c1) FROM t1;+ ------------ + ----------------- + | c1 | CHAR_LENGTH(c1)| + ------------ + ----------------- + | xy | 10 | + ------------ + ----------------- + 一排(0.00秒)
为所有存储引擎启用严格的SQL模式。无效的数据值被拒绝。有关详细信息,请参阅 严格SQL模式。
从MySQL 5.7.4通过5.7.7,
STRICT_ALL_TABLES包括的效果
ERROR_FOR_DIVISION_BY_ZERO,
NO_ZERO_DATE和
NO_ZERO_IN_DATE模式。有关其他讨论,请参阅
MySQL 5.7中的SQL模式更改。
为事务性存储引擎启用严格SQL模式,并在可能的情况下为非事务性存储引擎启用。有关详细信息,请参阅严格SQL模式。
从MySQL 5.7.4通过5.7.7,
STRICT_TRANS_TABLES
包括的效果
ERROR_FOR_DIVISION_BY_ZERO,
NO_ZERO_DATE和
NO_ZERO_IN_DATE模式。有关其他讨论,请参阅
MySQL 5.7中的SQL模式更改。
提供以下特殊模式作为上述列表中模式值组合的简写。
相当于
REAL_AS_FLOAT,
PIPES_AS_CONCAT,
ANSI_QUOTES,
IGNORE_SPACE,和(从MySQL 5.7.5的)
ONLY_FULL_GROUP_BY。
ANSI模式还会导致服务器返回一个查询错误,其中S具有外部引用
的集合函数
无法在已解析外部引用的外部查询中进行聚合。这是一个这样的问题:
S(outer_ref)
SELECT * FROM t1 WHERE t1.a IN(SELECT MAX(t1.b)FROM t2 WHERE ...);
在这里,MAX(t1.b)不能在外部查询中进行聚合,因为它出现在该WHERE查询的
子句中。标准SQL在这种情况下需要一个错误。如果
ANSI未启用模式,则服务器将
按照与其解释相同的方式处理
此类查询
。
S(outer_ref)S(const)
相当于
PIPES_AS_CONCAT,
ANSI_QUOTES,
IGNORE_SPACE,
NO_KEY_OPTIONS,
NO_TABLE_OPTIONS,
NO_FIELD_OPTIONS。
从MySQL 5.7.22开始,DB2
已被弃用。它将在未来版本的MySQL中被删除。
相当于
PIPES_AS_CONCAT,
ANSI_QUOTES,
IGNORE_SPACE,
NO_KEY_OPTIONS,
NO_TABLE_OPTIONS,
NO_FIELD_OPTIONS,
NO_AUTO_CREATE_USER。
从MySQL 5.7.22开始,
MAXDB已被弃用。它将在未来版本的MySQL中被删除。
相当于
PIPES_AS_CONCAT,
ANSI_QUOTES,
IGNORE_SPACE,
NO_KEY_OPTIONS,
NO_TABLE_OPTIONS,
NO_FIELD_OPTIONS。
从MySQL 5.7.22开始,
MSSQL已被弃用。它将在未来版本的MySQL中被删除。
等同于MYSQL323,
HIGH_NOT_PRECEDENCE。这意味着HIGH_NOT_PRECEDENCE
加上一些SHOW CREATE TABLE
特定的行为
MYSQL323:
从MySQL 5.7.22开始,
MYSQL323已被弃用。它将在未来版本的MySQL中被删除。
等同于MYSQL40,
HIGH_NOT_PRECEDENCE。这意味着HIGH_NOT_PRECEDENCE
加上一些特定的行为
MYSQL40。MYSQL323除了SHOW CREATE TABLE
不HEAP作为MEMORY表格的存储引擎显示之外,它们与for相同。
从MySQL 5.7.22开始,
MYSQL40已被弃用。它将在未来版本的MySQL中被删除。
相当于
PIPES_AS_CONCAT,
ANSI_QUOTES,
IGNORE_SPACE,
NO_KEY_OPTIONS,
NO_TABLE_OPTIONS,
NO_FIELD_OPTIONS,
NO_AUTO_CREATE_USER。
从MySQL 5.7.22开始,
ORACLE已被弃用。它将在未来版本的MySQL中被删除。
相当于
PIPES_AS_CONCAT,
ANSI_QUOTES,
IGNORE_SPACE,
NO_KEY_OPTIONS,
NO_TABLE_OPTIONS,
NO_FIELD_OPTIONS。
从MySQL 5.7.22开始,
POSTGRESQL已被弃用。它将在未来版本的MySQL中被删除。
MySQL的5.7.4之前,以及在MySQL 5.7.8或更高版本,
TRADITIONAL就相当于STRICT_TRANS_TABLES,
STRICT_ALL_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,和
NO_ENGINE_SUBSTITUTION。
从MySQL 5.7.4虽然5.7.7,
TRADITIONAL相当于STRICT_TRANS_TABLES,
STRICT_ALL_TABLES,
NO_AUTO_CREATE_USER,和
NO_ENGINE_SUBSTITUTION。这些NO_ZERO_IN_DATE,
NO_ZERO_DATE和
ERROR_FOR_DIVISION_BY_ZERO
模式没有命名,因为在这些版本中,它们的效果包含在严格SQL模式(STRICT_ALL_TABLES或
STRICT_TRANS_TABLES)的效果中。因此,TRADITIONAL所有MySQL 5.7版本的效果
都是一样的(和MySQL 5.6中的相同)。有关其他讨论,请参阅
MySQL 5.7中的SQL模式更改。
严格模式控制MySQL如何处理数据更改语句(如INSERTor)中的
无效值或缺失值
UPDATE。由于多种原因,值可能无效。例如,它可能具有该列的错误数据类型,或者它可能超出范围。当要插入的新行不包含定义中NULL没有显式DEFAULT子句的非列
的值时,缺少值。(对于
NULL列,NULL如果值缺失则插入。)严格模式也会影响DDL语句,如CREATE TABLE。
如果严格模式没有生效,MySQL会为无效值或缺失值插入调整值并产生警告(请参见
第13.7.5.40节“SHOW WARNINGS Syntax”)。在严格模式下,您可以使用INSERT IGNORE
或生成此行为
UPDATE
IGNORE。
对于SELECT
不会更改数据的语句,无效值将在严格模式下生成警告,而不是错误。
对于尝试创建超过最大密钥长度的密钥的严格模式会产生错误。严格模式未启用时,会导致警告并将密钥截断至最大密钥长度。
严格模式不影响是否检查外键约束。foreign_key_checks可以用于此。(请参见
第5.1.5节“服务器系统变量”。)
如果启用了STRICT_ALL_TABLES或者
STRICT_TRANS_TABLES已启用严格SQL模式
,但这些模式的效果有所不同:
对于事务性表,当启用STRICT_ALL_TABLES或
STRICT_TRANS_TABLES启用数据更改语句时,无效值或缺失值会发生错误
。该声明被中止并回滚。
对于非事务性表,如果在要插入或更新的第一行中出现错误值,那么对于任一模式的行为都是相同的:语句被中止并且表保持不变。如果语句插入或修改多行,并且第二行或更后一行中出现错误值,则结果取决于启用了哪个严格模式:
因为STRICT_ALL_TABLES,MySQL返回一个错误并忽略其余的行。但是,因为较早的行已被插入或更新,所以结果是部分更新。为避免这种情况,请使用单行语句,该语句可以在不更改表格的情况下中止。
因为
STRICT_TRANS_TABLES,MySQL会将无效值转换为列的最接近的有效值并插入调整后的值。如果缺少一个值,MySQL将插入列数据类型的隐式默认值。无论哪种情况,MySQL都会生成警告而不是错误,并继续处理该语句。第11.7节“数据类型默认值”中介绍了隐式默认值。
严格模式会影响日期中除零,零日期和零的处理,如下所示:
严格模式影响零除的处理,其中包括
:
MOD(N,0)
如果严格模式未启用,则除以零插入
NULL并不产生警告。
如果启用严格模式,除非IGNORE被零除,否则会产生错误。对于INSERT IGNORE和
UPDATE IGNORE,除以零插入NULL并产生警告。
因为SELECT,除以零回报NULL。启用严格模式也会产生警告。
严格模式会影响服务器是否允许
'0000-00-00'为有效日期:
如果严格模式未启用,
'0000-00-00'则允许并插入不会产生警告。
如果启用了严格模式,'0000-00-00'则不允许插入并且插入会产生错误,除非
IGNORE给出严格模式
。为
INSERT IGNORE和UPDATE
IGNORE,'0000-00-00'被允许和插入产生警告。
严格模式会影响服务器是否允许年份部分非零但月份或日期部分为0(日期如'2010-00-01'or
'2010-01-00')的日期:
如果未启用严格模式,则允许零部件的日期,并且插入不会产生警告。
如果启用了严格模式,则不允许使用零部件的日期,除非IGNORE给出严格模式,否则插入会产生错误
。对于
INSERT IGNORE和UPDATE
IGNORE,具有零部件的日期被插入
'0000-00-00'(这被认为是有效的IGNORE)并产生警告。
有关严格模式的更多信息
IGNORE,请参阅
IGNORE关键字和严格SQL模式的比较。
MySQL的5.7.4之前,以及在MySQL 5.7.8或更高版本,严格模式是零,零日期,并在日期零与一起影响部门的处理
ERROR_FOR_DIVISION_BY_ZERO,
NO_ZERO_DATE和
NO_ZERO_IN_DATE模式。从MySQL 5.7.4尽管5.7.7的
ERROR_FOR_DIVISION_BY_ZERO,
NO_ZERO_DATE以及
NO_ZERO_IN_DATE明确命名及其影响都包括在严格模式的影响时模式什么也不做。有关其他讨论,请参阅
MySQL 5.7中的SQL模式更改。
本节比较IGNORE关键字(将错误降级为警告)和严格SQL模式(将警告升级为错误)的语句执行效果
。它描述了它们影响哪些语句,以及它们适用于哪些错误。
下表列出了默认情况下产生错误与警告时语句行为的总结比较。默认情况下产生错误的一个示例是将a插入NULL到NOT
NULL列中。默认情况下产生警告的一个示例是将错误数据类型的值插入列(例如将字符串插入
'abc'到整数列中)。
| 操作模式 | 当语句默认为错误时 | 当语句默认为警告时 |
|---|---|---|
没有IGNORE或严格的SQL模式 |
错误 | 警告 |
同 IGNORE |
警告 | 警告(与没有IGNORE或严格的SQL模式相同) |
| 采用严格的SQL模式 | 错误(与没有IGNORE或严格的SQL模式相同) |
错误 |
采用IGNORE严格的SQL模式 |
警告 | 警告 |
从表中得出的一个结论是,当
IGNORE关键字和严格SQL模式都有效时,IGNORE优先。这意味着,尽管IGNORE严格的SQL模式可以被认为对错误处理有相反的效果,但它们在一起使用时不会取消。
MySQL中的几个语句支持一个可选的
IGNORE关键字。此关键字会导致服务器降级某些类型的错误并生成警告。对于多行语句,
IGNORE会导致语句跳到下一行而不是中止。
例如,如果表t具有主键列i,则尝试将相同的值i插入多行中通常会产生重复键错误:
MySQL的> INSERT INTO t (i) VALUES(1),(1);
错误1062(23000):键'PRIMARY'的重复条目'1'
使用时IGNORE,包含重复键的行仍未插入,但会发生警告而不是错误:
MySQL的>INSERT IGNORE INTO t (i) VALUES(1),(1);查询OK,1行受影响,1个警告(0.01秒) 记录:2个重复:1个警告:1 MySQL的>SHOW WARNINGS;+ --------- + ------ + -------------------------------- ------- + | 级别| 代码| 留言| + --------- + ------ + -------------------------------- ------- + | 警告| 1062 | 键'PRIMARY'|重复输入'1' + --------- + ------ + -------------------------------- ------- + 一排(0.00秒)
这些语句支持IGNORE关键字:
CREATE TABLE
... SELECT:IGNORE不适用于声明CREATE TABLE或
SELECT部分声明,而是插入到由声明产生的行表中
SELECT。丢弃在唯一键值上复制现有行的行。
DELETE:
IGNORE导致MySQL在删除行的过程中忽略错误。
INSERT:使用
IGNORE,丢弃在唯一键值上复制现有行的行。将设置为会导致数据转换错误的值设置为最接近的有效值。
UPDATE:与
IGNORE,在唯一键值上发生重复键冲突的行不会更新。行更新为将导致数据转换错误的值更新为最接近的有效值。
该IGNORE关键字适用于以下错误:
ER_BAD_NULL_ERRORER_DUP_ENTRYER_DUP_ENTRY_WITH_KEY_NAMEER_DUP_KEYER_NO_PARTITION_FOR_GIVEN_VALUEER_NO_PARTITION_FOR_GIVEN_VALUE_SILENTER_NO_REFERENCED_ROW_2ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SETER_ROW_IS_REFERENCED_2ER_SUBQUERY_NO_1_ROWER_VIEW_CHECK_FAILED
MySQL服务器可以在不同的SQL模式下运行,并且可以根据sql_mode
系统变量的值对不同的客户端应用不同的模式。在“ 严格 ” SQL模式下,服务器将某些警告升级为错误。
例如,在非严格SQL模式下,将字符串插入
'abc'到整数列中会导致将值转换为0并发出警告:
MySQL的>SET sql_mode = '';查询OK,0行受影响(0.00秒) MySQL的>INSERT INTO t (i) VALUES('abc');查询OK,1行受影响,1个警告(0.01秒) MySQL的>SHOW WARNINGS;+ --------- + ------ + -------------------------------- ------------------------ + | 级别| 代码| 留言| + --------- + ------ + -------------------------------- ------------------------ + | 警告| 1366 | 不正确的整数值:第1行|处的'i'列'abc' + --------- + ------ + -------------------------------- ------------------------ + 一排(0.00秒)
在严格的SQL模式下,无效值将被拒绝并出现错误:
MySQL的>SET sql_mode = 'STRICT_ALL_TABLES';查询OK,0行受影响(0.00秒) MySQL的>INSERT INTO t (i) VALUES('abc');错误1366(HY000):错误的整数值:'abc'列1中的列'i'
有关sql_mode系统变量的可能设置的更多信息
,请参见
第5.1.8节“服务器SQL模式”。
严格SQL模式适用于下列语句,在某些条件下某些值可能超出范围,或者将无效行插入或从表中删除:
在存储的程序中,如果程序是在严格模式生效的情况下定义的,那么刚刚列出的类型的单个语句将以严格的SQL模式执行。
严格SQL模式适用于以下错误,表示输入值无效或缺失的一类错误。如果该列的数据类型错误或者可能超出范围,则该值无效。如果要插入的新行不包含定义中NOT
NULL没有显式DEFAULT子句的列
的值,则缺少值。
ER_BAD_NULL_ERRORER_CUT_VALUE_GROUP_CONCATER_DATA_TOO_LONGER_DATETIME_FUNCTION_OVERFLOWER_DIVISION_BY_ZEROER_INVALID_ARGUMENT_FOR_LOGARITHMER_NO_DEFAULT_FOR_FIELDER_NO_DEFAULT_FOR_VIEW_FIELDER_TOO_LONG_KEYER_TRUNCATED_WRONG_VALUEER_TRUNCATED_WRONG_VALUE_FOR_FIELDER_WARN_DATA_OUT_OF_RANGEER_WARN_NULL_TO_NOTNULLER_WARN_TOO_FEW_RECORDSER_WRONG_ARGUMENTSER_WRONG_VALUE_FOR_TYPEWARN_DATA_TRUNCATED
在MySQL 22年7月5日,这些SQL模式被取消,并将在MySQL的未来版本中删除:
DB2,
MAXDB,
MSSQL,
MYSQL323,
MYSQL40,
ORACLE,
POSTGRESQL,
NO_FIELD_OPTIONS,
NO_KEY_OPTIONS,
NO_TABLE_OPTIONS。
在MySQL 5.7中,ONLY_FULL_GROUP_BY默认情况下启用了
SQL模式,因为GROUP BY
处理变得更加复杂,包括检测功能依赖关系。但是,如果您发现已
ONLY_FULL_GROUP_BY启用导致现有应用程序的查询被拒绝,则这些操作中的任何一个都应该恢复操作:
如果可以修改有问题的查询,请这么做,以便非聚合列在功能上依赖于GROUP BY列,或者通过使用非聚合列引用
ANY_VALUE()。
如果无法修改违规查询(例如,如果它是由第三方应用程序生成的),请sql_mode在服务器启动时将系统变量设置为不启用
ONLY_FULL_GROUP_BY。
在MySQL 5.7中,
ERROR_FOR_DIVISION_BY_ZERO,
NO_ZERO_DATE,和
NO_ZERO_IN_DATESQL模式已被弃用。长期计划是将三种模式包含在严格的SQL模式中,并将它们作为明确的模式在未来的MySQL版本中删除。为了兼容MySQL 5.7和MySQL 5.6严格模式并为受影响的应用程序提供更多时间修改,以下行为适用:
ERROR_FOR_DIVISION_BY_ZERO,
NO_ZERO_DATE并且
NO_ZERO_IN_DATE不是严格SQL模式的一部分,但它旨在与严格模式一起使用。提醒一下,如果在未启用严格模式的情况下启用警告,则会发生警告,反之亦然。
ERROR_FOR_DIVISION_BY_ZERO,,
NO_ZERO_DATE并且
NO_ZERO_IN_DATE默认启用。
通过上述更改,默认情况下仍会启用更严格的数据检查,但可以在当前希望或必须执行此操作的环境中禁用各个模式。
MySQL中对IPv6的支持包括以下功能:
MySQL服务器可以接受来自通过IPv6连接的客户端的TCP / IP连接。例如,该命令通过IPv6连接到本地主机上的MySQL服务器:
外壳> mysql -h ::1
要使用这种能力,必须有两件事情是真实的:
您的系统必须配置为支持IPv6。请参见 第5.1.9.1节“验证IPv6的系统支持”。
除IPv4连接外,默认的MySQL服务器配置允许IPv6连接。要更改默认配置,请使用适当的--bind-address
选项启动服务器。请参见第5.1.5节“服务器系统变量”。
MySQL帐户名允许IPv6地址启用DBA为通过IPv6连接到服务器的客户端指定权限。请参见第6.2.3节“指定帐户名称”。IPv6地址可以在帐户名在这样的语句中指定
CREATE USER,
GRANT和
REVOKE。例如:
mysql>CREATE USER 'bill'@'::1' IDENTIFIED BY 'secret';mysql>GRANT SELECT ON mydb.* TO 'bill'@'::1';
IPv6功能支持字符串和内部格式IPv6地址格式之间的转换,并检查值是否代表有效的IPv6地址。例如,
INET6_ATON()以及
INET6_NTOA()类似于
INET_ATON()和
INET_NTOA(),但除了IPv4地址处理IPv6地址。参见
第12.20节“其他功能”。
以下各节介绍如何设置MySQL,以便客户端可以通过IPv6连接到服务器。
在MySQL服务器可以接受IPv6连接之前,服务器主机上的操作系统必须支持IPv6。作为一个简单的测试来确定它是否属实,请尝试以下命令:
外壳> ping6 ::1
来自:: 1的16个字节,icmp_seq = 0 hlim = 64时间= 0.171ms
来自:: 1的16个字节,icmp_seq = 1hlim = 64时间= 0.077ms
...
要生成系统网络接口的说明,请调用ifconfig -a并在输出中查找IPv6地址。
如果您的主机不支持IPv6,请查阅系统文档以获取启用它的说明。您可能只需要重新配置现有网络接口即可添加IPv6地址。或者可能需要更广泛的更改,例如启用IPv6选项重建内核。
这些链接可能有助于在各种平台上设置IPv6:
MySQL服务器在单个网络套接字上侦听TCP / IP连接。该套接字绑定到单个地址,但地址可能映射到多个网络接口。要指定地址,请
在服务器启动时使用该
选项,其中
是IPv4或IPv6地址或主机名。(在MySQL 5.5.3之前不支持IPv6地址。)如果
是主机名,则服务器将该名称解析为IP地址并绑定到该地址。
--bind-address=addraddraddr
服务器如下处理不同类型的地址:
如果地址是*,则服务器在所有服务器主机IPv6和IPv4接口上接受TCP / IP连接(如果服务器主机支持IPv6),否则接受所有IPv4地址上的TCP / IP连接。使用此地址允许所有服务器接口上的IPv4和IPv6连接。该值是默认值。
如果地址是0.0.0.0,则服务器接受所有服务器主机IPv4接口上的TCP / IP连接。
如果地址是::,则服务器接受所有服务器主机IPv4和IPv6接口上的TCP / IP连接。使用此地址允许所有服务器接口上的IPv4和IPv6连接。
如果地址是IPv4映射地址,则服务器接受IPv4或IPv6格式的该地址的TCP / IP连接。例如,如果服务器绑定
::ffff:127.0.0.1,客户端可以使用--host=127.0.0.1或
连接--host=::ffff:127.0.0.1。
如果地址是“ 常规 ” IPv4或IPv6地址(如127.0.0.1或
::1),则服务器仅接受该IPv4或IPv6地址的TCP / IP连接。
如果您打算将服务器绑定到特定地址,请确保mysql.user授权表中包含具有可用于连接到该地址的管理权限的帐户。否则,您将无法关闭服务器。例如,如果将服务器绑定到*,则可以使用所有现有帐户连接到该服务器
。但是如果你绑定了服务器::1,它只接受该地址上的连接。在这种情况下,首先确保'root'@'::1'帐户存在于mysql.user表中,这样您仍然可以连接到服务器以将其关闭。
以下过程显示如何配置MySQL以允许通过使用::1本地主机地址连接到本地服务器的客户端进行IPv6连接。这里给出的说明假定您的系统支持IPv6。
使用适当的--bind-address选项启动MySQL服务器
以允许它接受IPv6连接。例如,在服务器选项文件中放入以下行并重新启动服务器:
的[mysqld] bind-address = *
或者,您可以将服务器绑定到服务器
::1,但这会使服务器对TCP / IP连接的限制更多。它只接受该单个地址的IPv6连接并拒绝IPv4连接。有关更多信息,请参见
第5.1.9.2节“配置MySQL服务器以允许IPv6连接”。
作为管理员,请连接到服务器并为将从::1本地IPv6主机地址连接的本地用户创建一个帐户
:
MySQL的> CREATE USER 'ipv6user'@'::1' IDENTIFIED BY 'ipv6pass';
有关帐户名称中IPv6地址的允许语法,请参见第6.2.3节“指定帐户名称”。除了
CREATE USER声明之外,您还可以发布GRANT为帐户提供特定权限的声明,但对于此过程中的其余步骤而言,这不是必需的。
调用mysql客户端以使用新帐户连接到服务器:
外壳> mysql -h ::1 -u ipv6user -pipv6pass
尝试一些显示连接信息的简单语句:
MySQL的>STATUS... 连接::: 1通过TCP / IP ... MySQL的>SELECT CURRENT_USER(), @@bind_address;+ ---------------- + ---------------- + | CURRENT_USER()| @@ bind_address | + ---------------- + ---------------- + | ipv6user @ :: 1 | :: | + ---------------- + ---------------- +
以下过程显示如何配置MySQL以允许远程客户端进行IPv6连接。它与本地客户端的上述过程类似,但服务器和客户端主机是不同的,并且每个都有自己的非本地IPv6地址。该示例使用这些地址:
服务器主机:2001:db8:0:f101 :: 1 客户端主机:2001:db8:0:f101 :: 2
这些地址是从IANA 为推荐文档推荐的不可路由地址范围中选择的, 并且足以在本地网络上进行测试。要接受来自本地网络外部客户端的IPv6连接,服务器主机必须具有公共地址。如果您的网络提供商为您分配了IPv6地址,则可以使用该地址。否则,另一种获取地址的方式是使用IPv6代理; 请参见第5.1.9.5节“从代理获取IPv6地址”。
使用适当的--bind-address选项启动MySQL服务器
以允许它接受IPv6连接。例如,在服务器选项文件中放入以下行并重新启动服务器:
的[mysqld] bind-address = *
或者,您可以将服务器绑定到服务器
2001:db8:0:f101::1,但这会使服务器对TCP / IP连接的限制更多。它只接受该单个地址的IPv6连接并拒绝IPv4连接。有关更多信息,请参见
第5.1.9.2节“配置MySQL服务器以允许IPv6连接”。
在服务器主机(2001:db8:0:f101::1)上,为将从客户端主机(2001:db8:0:f101::2)连接的用户创建一个帐户:
MySQL的> CREATE USER 'remoteipv6user'@'2001:db8:0:f101::2' IDENTIFIED BY 'remoteipv6pass';
在客户端主机(2001:db8:0:f101::2)上,调用mysql客户端以使用新帐户连接到服务器:
外壳> mysql -h 2001:db8:0:f101::1 -u remoteipv6user -premoteipv6pass
尝试一些显示连接信息的简单语句:
MySQL的>STATUS... 连接:2001:db8:0:f101 :: 1通过TCP / IP ... MySQL的>SELECT CURRENT_USER(), @@bind_address;+ ----------------------------------- + ------------- --- + | CURRENT_USER()| @@ bind_address | + ----------------------------------- + ------------- --- + | remoteipv6user @ 2001:db8:0:f101 :: 2 | :: | + ----------------------------------- + ------------- --- +
如果您没有使您的系统能够通过本地网络外的IPv6进行通信的公共IPv6地址,则可以从IPv6代理获取一个IPv6地址。在 维基百科的IPv6隧道代理页列出了几个经纪人和他们的功能,如是否提供静态地址和所支持的路由协议。
将服务器主机配置为使用代理提供的IPv6地址后,使用适当的--bind-address选项启动MySQL服务器
以允许服务器接受IPv6连接。例如,将以下行放在服务器选项文件中并重新启动服务器:
的[mysqld] bind-address = *
或者,您可以将服务器绑定到代理提供的特定IPv6地址,但这会使服务器对TCP / IP连接的限制更多。它只接受该单个地址的IPv6连接并拒绝IPv4连接。有关更多信息,请参见 第5.1.9.2节“配置MySQL服务器以允许IPv6连接”。另外,如果代理分配动态地址,则为您的系统提供的地址可能会在下次连接到代理时发生变化。如果是这样,那么您创建该名称的原始地址的任何帐户都将失效。要绑定到特定的地址,但要避免这种地址更改问题,您可以与代理安排静态IPv6地址。
以下示例显示如何在Gentoo Linux上使用Freenet6作为代理和gogoc IPv6客户端软件包。
通过访问此URL并注册,在Freenet6上创建一个帐户:
http://gogonet.gogo6.com
创建帐户后,转至此URL,登录并为IPv6代理创建用户标识和密码:
http://gogonet.gogo6.com/page/freenet6-registration
至于root,安装
gogoc:
外壳> emerge gogoc
编辑/etc/gogoc/gogoc.conf设置
userid和password
值。例如:
用户ID = gogouser 的passwd = gogopass
开始gogoc:
外壳> /etc/init.d/gogoc start
每次系统启动时 要启动gogoc,请执行以下命令:
外壳> rc-update add gogoc default
使用ping6尝试ping主机:
外壳> ping6 ipv6.google.com
要查看您的IPv6地址:
外壳> ifconfig tun
MySQL服务器维护几个时区设置:
系统时区。当服务器启动时,它会尝试确定主机的时区并使用它来设置system_time_zone系统变量。该值此后不会改变。
您可以在启动时使用mysqld_safe
选项为MySQL服务器设置系统时区
。您也可以在启动mysqld之前设置环境变量来设置它。对于允许值或
是取决于系统。请查阅您的操作系统文档以查看可接受的值。
--timezone=timezone_nameTZ--timezoneTZ
服务器的当前时区。全局
time_zone系统变量指示服务器当前正操作的时区。为初始值
time_zone是
'SYSTEM',其指示该服务器时区是相同的系统时区。
如果设置为SYSTEM,则每个需要时区计算的MySQL函数调用都会调用系统库来确定当前系统时区。此调用可能受全局互斥体保护,导致争用。
初始全局服务器时区值可以在启动时通过
命令行上的选项显式指定
,也可以在选项文件中使用以下行:
--default-time-zone=timezone
default-time-zone =' timezone'
如果您有SUPER
权限,则可以使用以下语句在运行时设置全局服务器时区值:
MySQL的> SET GLOBAL time_zone = timezone;
每连接时区。每个连接的客户端都有自己的时区设置,由会话time_zone变量给出
。最初,会话变量从全局变量中获取其值time_zone,但客户端可以使用以下语句更改其自己的时区:
MySQL的> SET time_zone = timezone;
当前会话时区设置会影响对区域敏感的时间值的显示和存储。这包括诸如NOW()或
的函数显示的值
CURTIME(),以及存储在TIMESTAMP列中并从列中检索的值。TIMESTAMP列的值从当前时区转换为UTC存储,并从UTC转换到当前时区以供检索。
当前时区设置不影响由功能显示的值,如UTC_TIMESTAMP()
在或值DATE,
TIME或
DATETIME列。这些数据类型中的值也不以UTC存储; 时区仅适用于从TIMESTAMP值转换时。如果你想区域特定算术
DATE,
TIME或
DATETIME值,将其转换为UTC,执行算术,然后再转换回。
全局和客户特定时区的当前值可以像这样获取:
MySQL的> SELECT @@global.time_zone, @@session.time_zone;
timezone 值可以用几种格式给出,其中没有一个是区分大小写的:
该值'SYSTEM'表示时区应该与系统时区相同。
该值可以以字符串的形式给出,指示与UTC的偏移量,如'+10:00'或
'-6:00'。
该值可以被给定为指定的时间区,如
'Europe/Helsinki',
'US/Eastern',或'MET'。只有在mysql数据库中的时区信息表已被创建并填充后,才能使用命名时区。
mysql系统数据库中有
多个表用于维护时区信息(请参见
第5.3节“MySQL系统数据库”)。MySQL安装过程创建时区表,但不加载它们。您必须使用以下说明手动执行此操作。
加载时区信息不一定是一次性操作,因为信息偶尔会改变。发生此类更改时,使用旧规则的应用程序会过时,并且您可能会发现需要重新加载时区表以使MySQL服务器使用的信息保持最新状态。请参阅本节末尾的注释。
如果您的系统具有自己的
zoneinfo数据库(描述时区的文件集),则应使用
mysql_tzinfo_to_sql程序填充时区表。这样的系统的例子是Linux,FreeBSD,Solaris和OS X.这些文件的一个可能位置是
/usr/share/zoneinfo目录。如果您的系统没有zoneinfo数据库,则可以使用本节后面所述的可下载软件包。
该mysql_tzinfo_to_sql程序用于装载时区表。在命令行上,将zoneinfo目录路径名称传递给mysql_tzinfo_to_sql并将输出发送到mysql程序。例如:
外壳> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql_tzinfo_to_sql读取您系统的时区文件并从中生成SQL语句。 mysql处理这些语句来加载时区表。
mysql_tzinfo_to_sql也可用于加载单个时区文件或生成闰秒信息:
要加载tz_file与时区名称对应的单个时区文件
,请像这样tz_name调用
mysql_tzinfo_to_sql:
外壳> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql
采用这种方法,您必须执行单独的命令来加载服务器需要了解的每个命名区域的时区文件。
如果您的时区需要考虑闰秒,请像这样初始化闰秒信息,其中
tz_file是您的时区文件的名称:
外壳> mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql
运行mysql_tzinfo_to_sql之后,最好重新启动服务器,以便它不会继续使用任何先前缓存的时区数据。
如果您的系统没有zoneinfo数据库(例如Windows),那么您可以使用可在MySQL Developer Zone上下载的软件包:
http://dev.mysql.com/downloads/timezones.html
下载包含SQL语句的时区包并将其解压缩,然后将包文件内容加载到时区表中:
外壳> mysql -u root mysql < file_name
然后重新启动服务器。
千万不能使用包含一个可下载的包MyISAM桌。MySQL 5.7及更高版本
InnoDB用于时区表。试图用MyISAM表替换它们会导致问题。
如果您的系统有zoneinfo数据库,请不要使用可下载的软件包。改用mysql_tzinfo_to_sql工具。否则,您可能会在MySQL和系统上的其他应用程序之间的日期时间处理方面产生差异。
有关复制设置中的时区设置的信息,请参见第16.4.1节“复制功能和问题”。
当时区规则更改时,使用旧规则的应用程序将变得过时。要保持最新状态,有必要确保系统使用当前时区信息。对于MySQL,在保持当前状态时需要考虑两个因素:
如果其时区设置为,则操作系统时间会影响MySQL服务器使用的时间值
SYSTEM。确保您的操作系统正在使用最新的时区信息。对于大多数操作系统,最新的更新或服务包会为系统准备好时间更改。查看您的操作系统供应商的网站,获取解决时间更改的更新。
如果您将系统的/etc/localtime时区文件替换为
使用与mysqld启动时有效的规则不同的版本,
则应重新启动
mysqld以使其使用更新后的规则。否则,当系统更改时间时,mysqld可能不会注意到。
如果您在MySQL中使用命名时区,请确保mysql数据库中的时区表是最新的。如果您的系统具有自己的zoneinfo数据库,则每当更新zoneinfo数据库时,您应该重新加载MySQL时区表。对于没有自己的zoneinfo数据库的系统,请检查MySQL Developer Zone的更新。当有新的更新可用时,请下载并使用它来替换当前时区表的内容。有关这两种方法的说明,请参阅填充时区表。
mysqld的缓存它查找的时区信息,因此在更新时区表之后,应重新启动mysqld以确保它不会继续提供过时的时区数据。
如果您不确定命名时区是否可用,请将其用作服务器的时区设置或由设置其自己的时区的客户端使用,请检查您的时区表是否为空。以下查询确定包含时区名称的表是否有任何行:
MySQL的> SELECT COUNT(*) FROM mysql.time_zone_name;
+ ---------- +
| COUNT(*)|
+ ---------- +
| 0 |
+ ---------- +
计数为零表示该表为空。在这种情况下,没有人可以使用命名时区,并且不需要更新表格。大于零的计数表示该表格不是空的,并且其内容可用于命名时区支持。在这种情况下,您应该确保重新加载时区表,以便任何使用命名时区的人都能得到正确的查询结果。
要检查您的MySQL安装是否已正确更新以适应夏令时规则的更改,请使用如下所示的测试。该示例使用的值适用于3月11日凌晨2点在美国发生的2007 DST 1小时更改
测试使用这两个查询:
SELECT CONVERT_TZ('2007-03-11 2:00:00','US / Eastern','US / Central'); SELECT CONVERT_TZ('2007-03-11 3:00:00','US / Eastern','US / Central');
这两个时间值表示发生DST更改的时间,并且使用命名时区要求使用时区表。期望的结果是两个查询都返回相同的结果(输入时间,转换为'US / Central'时区中的等效值)。
在更新时区表之前,您会看到如下所示的错误结果:
MySQL的>SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');+ ------------------------------------------------- ----------- + | CONVERT_TZ('2007-03-11 2:00:00','US / Eastern','US / Central')| + ------------------------------------------------- ----------- + | 2007-03-11 01:00:00 | + ------------------------------------------------- ----------- + MySQL的>SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');+ ------------------------------------------------- ----------- + | CONVERT_TZ('2007-03-11 3:00:00','美国/东部','美国/中央')| + ------------------------------------------------- ----------- + | 2007-03-11 02:00:00 | + ------------------------------------------------- ----------- +
更新表格后,您应该看到正确的结果:
MySQL的>SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');+ ------------------------------------------------- ----------- + | CONVERT_TZ('2007-03-11 2:00:00','US / Eastern','US / Central')| + ------------------------------------------------- ----------- + | 2007-03-11 01:00:00 | + ------------------------------------------------- ----------- + MySQL的>SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');+ ------------------------------------------------- ----------- + | CONVERT_TZ('2007-03-11 3:00:00','美国/东部','美国/中央')| + ------------------------------------------------- ----------- + | 2007-03-11 01:00:00 | + ------------------------------------------------- ----------- +
闰秒值以时间部分返回,以时间部分结束
:59:59。这意味着
NOW()在闰秒期间可以返回相同的值两到三秒的功能。时间部分以时间部分结尾:59:60或被
:59:61认为是无效的字面时间值仍然是事实。
如果有必要TIMESTAMP在闰秒前一秒搜索
值,则可以通过与'YYYY-MM-DD hh:mm:ss'
值进行比较来获得异常结果。以下示例演示了这一点。它将本地时区更改为UTC,因此内部值(以UTC表示)与显示值(已应用时区校正)之间没有区别。
MySQL的>CREATE TABLE t1 (a INT,ts TIMESTAMP DEFAULT NOW(),PRIMARY KEY (ts));查询OK,0行受影响(0.01秒) mysql>-- change to UTCmysql>SET time_zone = '+00:00';查询OK,0行受影响(0.00秒) mysql>-- Simulate NOW() = '2008-12-31 23:59:59'mysql>SET timestamp = 1230767999;查询OK,0行受影响(0.00秒) MySQL的>INSERT INTO t1 (a) VALUES (1);查询OK,1行受影响(0.00秒) mysql>-- Simulate NOW() = '2008-12-31 23:59:60'mysql>SET timestamp = 1230768000;查询OK,0行受影响(0.00秒) MySQL的>INSERT INTO t1 (a) VALUES (2);查询OK,1行受影响(0.00秒) mysql>-- values differ internally but display the samemysql>SELECT a, ts, UNIX_TIMESTAMP(ts) FROM t1;+ ------ + --------------------- + -------------------- + | a | ts | UNIX_TIMESTAMP(ts)| + ------ + --------------------- + -------------------- + | 1 | 2008-12-31 23:59:59 | 1230767999 | | 2 | 2008-12-31 23:59:59 | 1230768000 | + ------ + --------------------- + -------------------- + 设置2行(0.00秒) mysql>-- only the non-leap value matchesmysql>SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:59';+ ------ + --------------------- + | a | ts | + ------ + --------------------- + | 1 | 2008-12-31 23:59:59 | + ------ + --------------------- + 一排(0.00秒) mysql>-- the leap value with seconds=60 is invalidmysql>SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:60';空集,2个警告(0.00秒)
要解决此问题,可以使用基于实际存储在列中的UTC值进行的比较,其中应用了闰秒更正:
mysql>-- selecting using UNIX_TIMESTAMP value return leap valuemysql>SELECT * FROM t1 WHERE UNIX_TIMESTAMP(ts) = 1230768000;+ ------ + --------------------- + | a | ts | + ------ + --------------------- + | 2 | 2008-12-31 23:59:59 | + ------ + --------------------- + 一排(0.00秒)
MySQL服务器支持HELP
从MySQL参考手册返回信息的语句(参见第13.8.3节“HELP语法”)。mysql系统数据库中的多个表格
包含支持此语句所需的信息(请参见
第5.3节“MySQL系统数据库”)。这个语句的正确操作要求这些帮助表被初始化,这是通过处理fill_help_tables.sql脚本的内容来完成的
。
如果您在Unix上使用二进制或源代码发行版安装MySQL,则在初始化数据目录时会发生帮助表内容初始化(请参见 第2.10.1节“初始化数据目录”)。对于Linux上的RPM分发版或Windows上的二进制分发版,内容初始化是作为MySQL安装过程的一部分发生的。
如果使用二进制分发版升级MySQL,则不会自动升级帮助表内容,但可以手动升级它。fill_help_tables.sql
在share或
share/mysql目录中找到该文件。将位置更改为该目录,然后使用mysql客户端处理该文件,
如下所示:
外壳> mysql -u root mysql < fill_help_tables.sql
您也可以随时获得最新信息
fill_help_tables.sql以升级您的帮助表。从http://dev.mysql.com/doc/index-other.html下载适用于您的MySQL版本的正确文件。下载并解压文件后,如前所述用mysql进行处理
。
如果您正在使用Git和MySQL开发源代码树,则必须使用该fill_help_tables.sql文件的下载副本,
因为源代码树仅包含“ 存根 ”版本。
对于参与复制的服务器,帮助表内容升级过程涉及多个服务器。有关详细信息,请参见第16.4.1.26节“服务器端帮助表的复制”。
在Unix上,信号可以发送到进程。 mysqld响应发送给它的信号如下:
SIGTERM 导致服务器关闭。
SIGHUP导致服务器重新加载授权表并刷新表,日志,线程缓存和主机缓存。这些行为就像FLUSH声明的各种形式
。服务器还将状态报告写入具有以下格式的错误日志中:
状态信息: 当前目录:/ var / mysql / data / 正在运行的线程:0堆栈大小:196608 当前锁定: 关键缓存: 默认 Buffer_size:8388600 Block_size:1024 Division_limit:100 Age_limit:300 使用的块:0 不刷新:0 w_requests:0 写道:0 r_requests:0 读数:0 处理程序状态 read_key:0 read_next:0 read_rnd 0 read_first:1 写:0 删除0 更新:0 表状态: 打开桌子:5 打开表格:0 打开文件:7 开放流:0 报警状态: 活动警报:1 最大使用警报:2 下一个闹钟时间:67
服务器关机过程如下所示:
关机过程启动。
这可能发生在几种方式。例如,具有该SHUTDOWN特权的用户可以执行mysqladmin shutdown命令。
mysqladmin可以在MySQL支持的任何平台上使用。其他操作系统特定的关闭启动方法也是可能的:服务器在接收到SIGTERM信号时在Unix上关闭。在服务管理器告诉它时,在Windows上作为服务运行的服务器关闭。
服务器根据需要创建关闭线程。
根据启动关闭的方式,服务器可能会创建一个线程来处理关闭过程。如果客户端请求关闭,则会创建一个关闭线程。如果关闭是接收SIGTERM信号的结果
,则信号线程可能自己处理关闭,或者它可能会创建一个单独的线程来执行关闭。如果服务器尝试创建关闭线程并且不能(例如,如果内存耗尽),它会发出一条诊断消息,该消息出现在错误日志中:
错误:无法创建线程来终止服务器
服务器停止接受新的连接。
为防止在关闭期间启动新活动,服务器通过关闭它通常侦听连接的网络接口的处理程序来停止接受新的客户端连接:TCP / IP端口,Unix套接字文件,Windows命名管道和Windows上的共享内存。
服务器终止当前活动。
对于与客户端连接关联的每个线程,服务器将断开与客户端的连接并将线程标记为已终止。线程在注意到它们如此标记时死亡。用于空闲连接的线程快速死亡。当前正在处理语句的线程会定期检查它们的状态,并花更长的时间去死。有关线程终止的更多信息,请参见第13.7.6.4节“KILL语法”,特别是有关表关于终止
REPAIR TABLE或
OPTIMIZE TABLE操作
的说明MyISAM。
对于具有开放事务的线程,事务将回滚。如果一个线程正在更新一个非事务表,一个诸如多行的操作
UPDATE或者
INSERT可能会使该表部分更新,因为该操作可能会在完成之前终止。
如果服务器是主复制服务器,它将像其他客户端线程一样处理与当前连接的从属关联的线程。也就是说,每个人都会被标记为死亡,并在下次检查其状态时退出。
如果服务器是从属复制服务器,则在将客户端线程标记为终止之前,它将停止I / O和SQL线程(如果它们处于活动状态)。SQL线程被允许完成其当前语句(以避免导致复制问题),然后停止。如果此时SQL线程处于事务的中间,则服务器将等待直到当前复制事件组(如果有)完成执行,或者直到用户发出一个KILL QUERY或
一个
KILL
CONNECTION语句。另请参见
第13.4.2.7节“STOP SLAVE语法”。由于无法回滚非事务性语句,为了保证崩溃安全的复制,只应使用事务性表。
为了保证从站的碰撞安全,您必须--relay-log-recovery启用从站才能运行
。
另请参见第16.2.4节“复制中继和状态日志”)。
服务器关闭或关闭存储引擎。
在这个阶段,服务器刷新表缓存并关闭所有打开的表。
每个存储引擎都会执行其管理的表所需的任何操作。
InnoDB将其缓冲池刷新到磁盘(除非innodb_fast_shutdown
是2),将当前LSN写入表空间,并终止其自己的内部线程。MyISAM
刷新表的任何挂起的索引写入。
服务器退出。
要向管理进程提供信息,服务器将返回以下列表中描述的退出代码之一。括号中的短语表示systemd为响应代码而采取的行动,systemd用于管理服务器的平台。
0 =成功终止(不重新启动)
1 =不成功终止(不重新启动)
2 =不成功终止(重新启动完成)
由MySQL服务器管理的信息存储在称为数据目录的目录下。以下列表简要描述了通常在数据目录中找到的项目,其中包含交叉参考以获取更多信息:
数据目录子目录。数据目录的每个子目录都是数据库目录,并对应于服务器管理的数据库。所有MySQL安装都有一些标准的数据库:
该mysql目录对应于
mysql系统数据库,其中包含MySQL服务器运行时所需的信息。请参见
第5.3节“MySQL系统数据库”。
该performance_schema目录对应于性能模式,该模式提供用于在运行时检查服务器的内部执行的信息。请参阅
第25章MySQL性能架构。
该sys目录与sys模式相对应,该
模式提供一组对象来帮助更轻松地解释性能模式信息。请参阅第26章,MySQL sys模式。
该ndbinfo目录对应于ndbinfo存储特定于NDB群集的信息的数据库(仅适用于构建为包含NDB群集的安装)。请参见
第21.5.10节“ndbinfo:NDB群集信息数据库”。
其他子目录对应于由用户或应用程序创建的数据库。
INFORMATION_SCHEMA 是标准数据库,但其实现不使用相应的数据库目录。
日志文件由服务器写入。请参见 第5.4节“MySQL服务器日志”。
InnoDB表空间和日志文件。请参阅
第14章,InnoDB存储引擎。
默认/自动生成的SSL和RSA证书和密钥文件。请参见第6.4.3节“创建SSL和RSA证书和密钥”。
服务器进程ID文件(服务器正在运行时)。
通过重新配置服务器,可将上述列表中的某些项目重新定位到其他位置。另外,该
--datadir选项可以改变数据目录本身的位置。对于给定的MySQL安装,请检查服务器配置以确定项目是否已移动。
该mysql数据库是系统数据库。它包含存储MySQL服务器运行时所需的信息的表。
mysql数据库中的
表格分为以下几类:
本节的其余部分列举了每个类别中的表格,其中包含交叉参考以获取更多信息。MyISAM除非另有说明,系统表使用存储引擎。
这些系统表包含有关存储程序,用户定义函数和服务器端插件的信息:
event:有关事件计划程序事件的信息。请参见第23.4节“使用事件调度程序”。服务器在其启动序列期间加载此表中列出的事件,除非以该--skip-grant-tables选项开始
。
func:有关用户定义函数(UDF)的信息。请参见第28.4节“向MySQL添加新功能”。服务器在其启动序列期间加载此表中列出的UDF,除非以该--skip-grant-tables选项开始
。
plugin:关于服务器端插件的信息。请参见第5.5.1节“安装和卸载插件”和
第28.2节“MySQL插件API”。服务器在其启动序列期间加载此表中列出的插件,除非以该--skip-grant-tables选项开始
。
在此之前,该plugin表使用InnoDBMySQL 5.7.6以上的
存储引擎
MyISAM。
proc:有关存储过程和函数的信息。请参见第23.2节“使用存储例程(过程和函数)”。
服务器使用这些系统表来支持复制:
gtid_executed:用于存储GTID值的表格。请参阅
mysql.gtid_executed表。
该gtid_executed表使用
InnoDB存储引擎。
ndb_binlog_index:NDB集群复制的二进制日志信息。请参见
第21.6.4节“NDB群集复制架构和表”。
slave_master_info,
slave_relay_log_info,
slave_worker_info:用于存储从服务器上复制信息。请参见
第16.2.4节“复制中继和状态日志”。
这些表使用InnoDB存储引擎。
这些系统表供优化器使用:
innodb_index_stats,
innodb_table_stats:用于
InnoDB持久性优化器统计信息。请参见第14.6.12.1节“配置持久优化器统计参数”。
server_cost,
engine_cost:优化器成本模型使用包含有关在查询执行期间发生的操作的成本估算信息的表。
server_cost包含一般服务器操作的优化器成本估算。
engine_cost包含特定于特定存储引擎的操作的估计。请参见
第8.9.5节“优化器成本模型”。
这些表使用InnoDB存储引擎。
其他系统表不属于上述类别:
audit_log_filter,
audit_log_user:如果安装了MySQL企业审计,这些表提供审计日志过滤器定义和用户帐户的持久存储。请参见
第6.5.5.8.1节“审核日志表”。
firewall_users,
firewall_whitelist:如果安装了MySQL企业防火墙,这些表为防火墙使用的信息提供持久存储。请参见
第6.5.6节“MySQL企业防火墙”。
servers:由
FEDERATED存储引擎使用。请参见
第15.8.2.2节“使用CREATE SERVER创建FEDERATED表”。
在此之前,该servers表使用InnoDBMySQL 5.7.6以上的
存储引擎
MyISAM。
MySQL服务器有几个日志可以帮助你找出正在发生的活动。
| 日志类型 | 写入日志的信息 |
|---|---|
| 错误日志 | 在启动,运行或停止mysqld时遇到的问题 |
| 一般查询日志 | 建立了客户的客户关系和声明 |
| 二进制日志 | 改变数据的语句(也用于复制) |
| 中继日志 | 从复制主服务器接收的数据更改 |
| 慢查询日志 | 查询花费了超过
long_query_time几秒的时间执行 |
| DDL日志(元数据日志) | 元数据操作由DDL语句执行 |
默认情况下,除Windows上的错误日志之外,不会启用任何日志。(DDL日志始终在需要时创建,并且没有用户可配置选项;请参见第5.4.6节“DDL日志”。)以下特定于日志的部分提供有关启用日志记录的服务器选项的信息。
默认情况下,服务器为数据目录中的所有启用日志写入文件。您可以通过刷新日志来强制服务器关闭并重新打开日志文件(或在某些情况下切换到新的日志文件)。发出FLUSH LOGS语句时发生日志刷新
; 用a
或者参数执行
mysqladmin ; 或使用
或
选项执行
mysqldump。请参见
第13.7.6.3节“FLUSH语法”,第4.5.2节“ mysqladmin - 管理MySQL服务器的客户端”和
第4.5.4节“ mysqldump - 数据库备份程序”flush-logsrefresh--flush-logs--master-data。另外,二进制日志在其大小达到max_binlog_size系统变量的值时被刷新
。
您可以在运行时控制常规查询和慢速查询日志。您可以启用或禁用日志记录,或更改日志文件名称。您可以告诉服务器编写通用查询和慢查询条目来记录表,日志文件或两者。有关详细信息,请参见 第5.4.1节“选择常规查询和慢查询日志输出目标”,第5.4.3节“常规查询日志”和 第5.4.5节“慢查询日志”。
中继日志仅用于从属复制服务器,用于保存主服务器上的数据更改,这些更改也必须在从属服务器上进行。有关继电器日志内容和配置的讨论,请参见 第16.2.4.1节“从站继电器日志”。
有关日志维护操作(如旧日志文件到期)的信息,请参见第5.4.7节“服务器日志维护”。
有关保持日志安全的信息,请参见 第6.1.2.3节“密码和日志记录”。
如果启用了这些日志,则MySQL服务器可以灵活地控制输出到普通查询日志和慢速查询日志的目标。日志条目的可能目标是日志文件或
数据库中的general_log和
slow_log表mysql。可以选择任一个或两个目的地。
服务器启动时的日志控制。
该--log-output选项指定日志输出的目的地。该选项本身不会启用日志。它的语法是
:
--log-output[=value,...]
如果--log-output给定值,则该值应该是一个或多个单词TABLE(记录到表),
FILE(记录到文件)或
NONE(不记录到表或文件)的以逗号分隔的列表。
NONE如果存在的话,优先于任何其他说明符。
如果--log-output省略,则默认日志记录目标为FILE。
该general_log系统变量控制记录到一般查询日志选定的日志目的地。如果在服务器启动时指定,
general_log则使用1或0的可选参数来启用或禁用日志。要指定文件记录的默认文件名以外的其他文件名,请设置
general_log_file变量。同样,slow_query_log
变量控制记录到所选目标的缓慢查询日志并设置
slow_query_log_file指定文件记录的文件名。如果启用了任一日志,则服务器将打开相应的日志文件并向其写入启动消息。但是,除非FILE选择了日志目标,否则不会进一步将查询记录到文件。
例子:
要将常规查询日志条目写入日志表和日志文件,请使用
--log-output=TABLE,FILE选择两个日志目标并
--general_log启用常规查询日志。
要将常规和慢查询日志条目仅写入日志表,请使用--log-output=TABLE
选择表作为日志目标,
--general_log并
--slow_query_log启用两个日志。
要仅将慢速查询日志条目写入日志文件,请使用
--log-output=FILE选择文件作为日志目标并
--slow_query_log启用慢速查询日志。(在这种情况下,由于默认日志目的地是FILE,您可以省略该
--log-output选项。)
运行时的日志控制。与日志表和文件关联的系统变量支持运行时控制日志记录:
全局log_output系统变量指示当前的日志记录目标。它可以在运行时修改以更改目标。
全局变量general_log和
slow_query_log变量指示常规查询日志和慢查询日志是启用(ON)还是禁用(OFF)。您可以在运行时设置这些变量以控制是否启用日志。
全局
变量general_log_file
和slow_query_log_file变量指示一般查询日志和慢速查询日志文件的名称。您可以在服务器启动时或运行时设置这些变量以更改日志文件的名称。
要禁用或启用当前连接的常规查询记录,请将会话sql_log_off变量设置
为
ON或OFF。
使用表格进行日志输出具有以下好处:
日志条目具有标准格式。要显示日志表的当前结构,请使用以下语句:
SHOW CREATE TABLE mysql.general_log; SHOW CREATE TABLE mysql.slow_log;
日志内容可通过SQL语句访问。这使得能够使用仅选择满足特定标准的日志条目的查询。例如,要选择与特定客户端关联的日志内容(这可以用于识别来自该客户端的有问题的查询),使用日志表比日志文件更容易。
可以通过任何可连接到服务器并发出查询的客户端(如果客户端具有适当的日志表权限)远程访问日志。没有必要登录到服务器主机并直接访问文件系统。
日志表实现具有以下特征:
一般来说,日志表的主要目的是为用户提供一个接口,以观察服务器的运行时执行情况,而不是干扰其运行时执行。
CREATE TABLE,
ALTER TABLE并且
DROP TABLE是日志表上的有效操作。对于ALTER TABLE
和DROP TABLE,日志表不能被使用,并且必须被禁用,如后面所述。
默认情况下,日志表使用CSV
以逗号分隔值格式写入数据的存储引擎。对于有权访问
.CSV包含日志表数据的文件的用户,这些文件很容易导入其他程序,例如可处理CSV输入的电子表格。
日志表可以更改为使用
MyISAM存储引擎。您不能使用它
ALTER TABLE来更改正在使用的日志表。日志必须先禁用。除日志表以外CSV或
没有其他引擎MyISAM合法的日志表。
要禁用日志记录以便可以更改(或删除)日志表,可以使用以下策略。该示例使用通用查询日志; 慢查询日志的过程类似,但使用slow_log表和
slow_query_log系统变量。
SET @old_log_state = @@ global.general_log; SET GLOBAL general_log ='OFF'; ALTER TABLE mysql.general_log ENGINE = MyISAM; SET GLOBAL general_log = @old_log_state;
TRUNCATE TABLE是日志表上的有效操作。它可以用来过期日志条目。
RENAME TABLE是日志表上的有效操作。您可以使用以下策略以原子方式重命名日志表(例如,执行日志循环):
使用mysql; DROP TABLE IF EXISTS general_log2; CREATE TABLE general_log2 LIKE general_log; RENAME TABLE general_log TO general_log_backup,general_log2 TO general_log;
CHECK TABLE 是日志表上的有效操作。
LOCK TABLES 不能在日志表上使用。
FLUSH TABLES WITH READ LOCK并且read_only
系统变量的状态对日志表没有影响。服务器始终可以写入日志表。
写入日志表的条目不写入二进制日志,因此不会复制到从属服务器。
要刷新日志表或日志文件,分别使用
FLUSH TABLES或
FLUSH LOGS。
不允许对日志表进行分区。
一个mysqldump的转储包括报表中重新创建这些表,以便它们不会重新加载转储文件后失踪。日志表内容不会被转储。
本节讨论如何配置MySQL服务器以将诊断消息记录到错误日志中。有关选择错误消息字符集或语言的信息,请参见 第10.6节“错误消息字符集”或 第10.11节“设置错误消息语言”。
错误日志包含mysqld 启动和关闭时间的记录。它还包含诊断消息,如服务器启动和关闭期间以及服务器运行期间发生的错误,警告和注释。例如,如果mysqld注意到需要自动检查或修复表,它会向错误日志写入消息。
在某些操作系统上,如果mysqld异常退出,错误日志将包含堆栈跟踪 。跟踪可用于确定mysqld退出的位置。请参见 第28.5节“调试和移植MySQL”。
如果用来启动mysqld,
mysqld_safe可能会将消息写入错误日志。例如,当mysqld_safe发现异常mysqld退出时,它会重新启动
mysqld并将mysqld
restarted消息写入错误日志。
以下各节讨论配置错误日志记录的方面。在讨论中,“ 控制台 ”表示
stderr标准错误输出。这是您的终端或控制台窗口,除非标准错误输出已被重定向到不同的目的地。
服务器在Windows和Unix系统上解释决定哪里写错误消息的选项有些不同。务必使用适合您的平台的信息配置错误日志记录。
在Windows上,mysqld的使用
--log-error,
--pid-file和
--console选项,以确定是否mysqld的写入错误日志到控制台或文件,并且,如果到一个文件,文件名:
如果--console给出,
mysqld将错误日志写入控制台。(
如果两者都给出,--console则优先于--log-error以下项目,下列项目
--log-error不适用。在MySQL 5.7之前,这是相反的:
--log-error优先于--console。)
如果--log-error没有给出,或没有命名文件,mysqld
会将错误日志写入
数据目录host_name.err--pid-file中指定的文件
,除非指定了该
选项。在这种情况下,文件名是PID文件基本名称,后缀为.err数据目录中的后缀。
如果--log-error命名文件,mysqld将错误日志写入该.err数据目录下的该文件(如果该名称没有后缀,则添加后缀),除非给出绝对路径名来指定不同的位置。
如果服务器将错误日志写入控制台,它会将
log_error系统变量设置为
stderr。否则,服务器将错误日志写入文件并设置
log_error为文件名。
另外,服务器默认将事件和错误消息写入应用程序日志中的Windows事件日志:
标记为Error,
Warning和Note写入到事件日志的条目,但不包括来自单个存储引擎的信息语句之类的消息。
事件日志条目有一个来源MySQL。
写入事件日志的信息使用log_syslog系统变量进行控制,
系统变量在Windows上默认启用。请参见
第5.4.2.3节“错误记录到系统日志”。
在Unix和类Unix系统上,mysqld使用该--log-error选项来确定mysqld是否将错误日志写入控制台或文件,并且如果是文件,则使用文件名:
如果--log-error没有给出,
mysqld将错误日志写入控制台。
如果--log-error没有命名文件,mysqld会将错误日志写入
数据目录中指定的文件
。
host_name.err
如果--log-error命名文件,mysqld将错误日志写入该.err数据目录下的该文件(如果该名称没有后缀,则添加后缀),除非给出绝对路径名来指定不同的位置。
如果--log-error在选项文件中给定的[mysqld],
[server]或
[mysqld_safe]部分,
mysqld_safe的查找和使用的选项,并将其传递到mysqld的。
Yum或APT软件包安装通常/var/log
使用诸如log-error=/var/log/mysqld.log服务器配置文件中的选项
来配置错误日志文件位置。从选项中删除文件名会导致
使用数据目录中的
文件。
host_name.err
如果服务器将错误日志写入控制台,它会将
log_error系统变量设置为
stderr。否则,服务器将错误日志写入文件并设置
log_error为文件名。
可以让mysqld将错误日志写入系统日志。这是Windows syslog上的事件日志,以及Unix和类Unix系统上的事件日志
。为此,请使用这些系统变量:
log_syslog:启用此变量将错误日志发送到系统日志。(在Windows上,log_syslog默认启用。)
如果log_syslog启用,则还可以使用以下系统变量进行更精细的控制。
log_syslog_facility:syslog消息的默认设施是
daemon。设置这个变量来指定一个不同的设施。
log_syslog_include_pid:是否在每行syslog输出中包含服务器进程ID
。
log_syslog_tag:这个变量定义了一个标签添加到
消息中的服务器标识符(mysqld)syslog。如果已定义,则标记将通过前导连字符附加到标识符上。
记录到系统日志可能需要额外的系统配置。查阅您的平台的系统日志文档。
在Unix和类Unix系统上,输出控制
syslog也可以使用
mysqld_safe,它可以捕获服务器错误输出并将其传递给syslog。
不建议使用mysqld_safe进行
syslog错误日志记录; 您应该使用服务器系统变量。
mysqld_safe的有三个错误日志选项,
--syslog,
--skip-syslog,和--log-error。不带日志记录选项或
--skip-syslog
默认值的默认值是使用默认日志文件。要明确指定使用错误日志文件,请指定
给 mysqld_safe,然后安排
mysqld将消息写入日志文件。要使用,请指定
选项。对于
输出,标签可以用来指定
; 这将附加到带有前导连字符的服务器标识符。
--log-error=file_namesyslog--syslogsyslog--syslog-tag=tag_valmysqld
该log_error_verbosity系统变量控制服务器详细程度编写错误,警告和说明消息的错误日志。允许值为1(仅限错误),2(错误和警告),3(错误,警告和注释),默认值为3.如果该值大于2,则服务器记录中止连接和拒绝访问错误用于新的连接尝试。参见第B.5.2.10节“通信错误和中止的连接”。
包含在错误日志消息中的ID是负责写入消息的mysqld内的线程的ID 。这表明服务器的哪个部分生成了消息,并且与一般查询日志和慢查询日志消息(包括连接线程ID)一致。
该log_timestamps系统变量控制时间戳的写入错误日志消息(以及一般查询日志和慢查询日志文件)的时区。允许的值是
UTC(默认)和
SYSTEM(本地系统时区)。
如果使用FLUSH ERROR
LOGS,FLUSH LOGS或
mysqladmin flush-logs刷新日志,服务器将关闭并重新打开其写入的任何错误日志文件。要重命名错误日志文件,请在刷新之前手动执行。刷新日志然后用原始文件名打开一个新文件。例如,假设日志文件名称为
,要重命名该文件并创建一个新文件,请使用以下命令:
host_name.err
mvhost_name.errhost_name.err-old mysqladmin flush-logs mvhost_name.err-oldbackup-directory
在Windows上,使用重命名而不是 mv。
如果错误文件的位置不能被服务器写入,则日志刷新操作无法创建新的日志文件。例如,在Linux上,服务器可能会将错误日志写为
/var/log/mysqld.log,其中
由mysqld/var/log拥有
root且不可写
。有关处理这种情况的信息,请参见第5.4.7节“服务器日志维护”。
如果服务器未写入指定的错误日志文件,则在刷新日志时不会发生错误日志文件重命名。
通用查询日志是mysqld正在做什么的一般记录 。服务器在客户端连接或断开连接时将信息写入此日志,并记录从客户端接收到的每条SQL语句。当您怀疑客户端发生错误并想确切知道客户端发送给mysqld时,通用查询日志可能非常有用。
显示客户端何时连接的每一行还包括
指示用于建立连接的协议。
是
(使用SSL建立的TCP / IP连接),(Unix套接字文件连接),(Windows命名管道连接)或(Windows共享内存连接)之一。
using
connection_typeconnection_typeTCP/IPSSL/TLSSocketNamed PipeShared Memory
mysqld按照接收它们的顺序将语句写入查询日志,这可能与它们的执行顺序不同。这个日志顺序与二进制日志的日志顺序相反,在执行它们之后但释放任何锁之前写入语句。另外,查询日志可能包含只能选择数据的语句,而这些语句从不写入二进制日志。
在复制主服务器上使用基于语句的二进制日志记录时,从服务器接收到的语句将写入每个从服务器的查询日志中。如果客户端使用mysqlbinlog实用程序读取事件并将它们传递给服务器,则会将语句写入主服务器的查询日志 。
然而,使用基于行的二进制日志记录时,更新的行更改,而不是SQL语句,因此当这些语句不会被写到查询日志发送
binlog_format的
ROW。当此变量设置为时MIXED,给定的更新也可能不会写入查询日志
,具体取决于所使用的语句。有关更多信息,请参见
第16.2.1.1节“基于声明和基于行的复制的优点和缺点”。
默认情况下,一般查询日志被禁用。要明确指定初始通用查询日志状态,请使用
--general_log[={0|1}]。没有参数或参数为1时,
--general_log启用日志。参数为0时,此选项禁用日志。要指定日志文件名称,请使用
。要指定日志目标,请使用
(如
第5.4.1节“选择常规查询和慢速查询日志输出目标”中所述)。
--general_log_file=file_name--log-output
如果您不为普通查询日志文件指定名称,则默认名称为
。服务器在数据目录中创建文件,除非给出绝对路径名来指定不同的目录。
host_name.log
要禁用或启用常规查询日志或在运行时更改日志文件名称,请使用全局
变量general_log和
general_log_file系统变量。设置general_log为0(或OFF)禁用日志或设为1(或
ON)启用它。设置
general_log_file为指定日志文件的名称。如果日志文件已经打开,它将被关闭并打开新文件。
当启用通用查询日志时,服务器将输出写入由--log-output选项或
log_output系统变量指定的任何目标
。如果启用日志,服务器将打开日志文件并向其写入启动消息。但是,除非FILE选择了日志目标,否则不会进一步将查询记录到文件。如果目标是
NONE,即使启用了常规日志,服务器也不写任何查询。如果日志目标值不包含,则设置日志文件名称对日志记录没有影响
FILE。
服务器重新启动并且日志刷新不会导致生成新的常规查询日志文件(尽管刷新关闭并重新打开它)。要重命名该文件并创建一个新文件,请使用以下命令:
shell> shell> shell>mvhost_name.loghost_name-old.logmysqladmin flush-logsmvhost_name-old.logbackup-directory
在Windows上,使用重命名而不是 mv。
您也可以通过禁用日志来在运行时重命名通用查询日志文件:
SET GLOBAL general_log ='OFF';
在禁用日志的情况下,从外部重命名日志文件; 例如,从命令行。然后再次启用日志:
SET GLOBAL general_log ='ON';
此方法适用于任何平台,不需要重新启动服务器。
会话sql_log_off变量可以设置为ON或OFF禁用或启用当前连接的通用查询记录。
写入通用查询日志的语句中的密码由服务器重写,不应以纯文本形式出现。通过使用该--log-raw选项启动服务器,可以为通用查询日志禁用密码重写
。此选项对于诊断目的可能很有用,可以查看服务器收到的语句的确切文本,但出于安全原因不建议将其用于生产用途。另请参见
第6.1.2.3节“密码和记录”。
密码重写的含义是无法解析的语句(例如,由于语法错误)不会写入常规查询日志,因为它们不能被称为无密码。需要记录所有语句(包括具有错误的语句)的用例应使用该
--log-raw选项,同时请记住,这也会绕过密码重写。
密码重写仅在需要纯文本密码时才会发生。对于需要密码哈希值的语法,不会发生重写。如果为这种语法错误地提供明文密码,则密码将按给定的方式记录,而不会重写。例如,下面的语句会按照所示进行记录,因为需要密码哈希值:
CREATE USER'user1'@'localhost'IDENTIFIED BY PASSWORD'not-so-secret';
所述log_timestamps系统变量控制在写入到通用查询日志文件消息的时间戳的时区(以及慢查询日志文件和错误日志)。它不会影响写入日志表的常规查询日志和慢速查询日志消息的时区,但可以使用CONVERT_TZ()或通过设置会话time_zone系统变量将从这些表中检索的行从本地系统时区转换为任何所需的时区
。
二进制日志包含描述数据库更改的“ 事件 ”,例如表创建操作或对表数据的更改。它还包含可能可能进行更改的语句的事件(例如,
DELETE不匹配行的a),除非使用基于行的日志记录。二进制日志还包含每条语句花费多长时间更新数据的信息。二进制日志有两个重要目的:
对于复制,主复制服务器上的二进制日志提供了要发送给从服务器的数据更改记录。主服务器将其二进制日志中包含的事件发送给其从服务器,从服务器执行这些事件以对主服务器进行相同的数据更改。请参见 第16.2节“复制实现”。
某些数据恢复操作需要使用二进制日志。备份恢复后,重新执行备份后记录的二进制日志中的事件。这些事件从备份的角度使数据库保持最新状态。请参见 第7.5节“使用二进制日志进行时间点恢复(增量)”。
二进制日志不用于诸如SELECT或
SHOW不修改数据的语句
。要记录所有语句(例如,确定问题查询),请使用常规查询日志。请参见第5.4.3节“常规查询日志”。
运行启用二进制日志记录的服务器会使性能稍微降低。但是,二进制日志的优势使您能够设置复制和恢复操作,这通常会超过此次要的性能下降。
二进制日志通常对意外暂停具有弹性,因为只有完整的事务被记录或回读。有关更多信息,请参见 第16.3.2节“处理意外的复制从站暂停”。
写入二进制日志的语句中的密码被服务器重写,不会以纯文本形式出现。另请参见 第6.1.2.3节“密码和记录”。
以下讨论描述了影响二进制日志记录操作的一些服务器选项和变量。有关完整列表,请参见 第16.1.6.4节“二进制日志记录选项和变量”。
要启用二进制日志,请使用该
选项启动服务器
。如果未给出值,则默认名称是该
选项的值(默认情况下是主机名称)后跟
。如果给出了基本名称,则服务器将该文件写入数据目录中,除非基本名称以前导绝对路径名给出以指定不同的目录。建议您明确指定一个基本名称,而不是使用主机名称的缺省值; 出于这个原因,请参见
第B.5.7节“MySQL中的已知问题”。
--log-bin[=base_name]base_namepid-file-bin
如果您在日志名称中提供了扩展名(例如,
),则会以静默方式删除并忽略扩展名。
--log-bin=base_name.extension
mysqld将数字扩展名附加到二进制日志基本名称以生成二进制日志文件名称。每次服务器创建一个新的日志文件时,该编号都会增加,从而创建一系列有序的文件。每次启动或刷新日志时,服务器都会在系列中创建一个新文件。当前日志的大小达到后,服务器还会自动创建一个新的二进制日志文件
max_binlog_size。二进制日志文件可能会变得比max_binlog_size如果您使用大型事务更大,
因为事务一次写入文件,永远不会在文件之间分割。
要跟踪哪些二进制日志文件已被使用,
mysqld还会创建一个二进制日志索引文件,其中包含所有使用的二进制日志文件的名称。默认情况下,它具有与二进制日志文件相同的基本名称和扩展名'.index'。您可以使用该
选项更改二进制日志索引文件的名称
。在mysqld运行时,您不应手动编辑此文件
; 这样做会混淆
mysqld。
--log-bin-index[=file_name]
术语“ 二进制日志文件 ”通常表示包含数据库事件的单个编号文件。术语 “ 二进制日志 ”共同表示编号的二进制日志文件加上索引文件的集合。
具有该SUPER
特权的客户端可以通过使用SET sql_log_bin=0语句禁用其自己的语句的二进制日志记录。请参见
第5.1.5节“服务器系统变量”。
默认情况下,服务器记录事件的长度以及事件本身,并使用它来验证事件写入是否正确。您还可以通过设置binlog_checksum系统变量,使服务器为事件写入校验和
。从二进制日志读回时,主设备默认使用事件长度,但可以通过启用master_verify_checksum系统变量使用校验和(如果可用)
。从I / O线程还会验证从主设备接收的事件。通过启用slave_sql_verify_checksum系统变量从中继日志读取时,可以使从属SQL线程使用校验和(如果可用)
。
记录在二进制日志中的事件的格式取决于二进制日志记录格式。支持三种格式类型,基于行的日志记录,基于语句的日志记录和混合基日志记录。使用的二进制日志记录格式取决于MySQL版本。有关日志格式的一般说明,请参见 第5.4.4.1节“二进制日志记录格式”。有关二进制日志格式的详细信息,请参阅 MySQL内部函数:二进制日志。
服务器以--binlog-do-db与--binlog-ignore-db选项和
选项相同的方式
评估
--replicate-do-db和
--replicate-ignore-db选项。有关如何完成的信息,请参见
第16.2.5.1节“数据库级复制和二进制日志记录选项的评估”。
默认情况下,复制从属服务器不会将从复制主服务器接收到的任何数据修改写入其自己的二进制日志。要记录这些修改,--log-slave-updates除了选项外,还要使用该选项启动从站--log-bin(请参见第16.1.6.3节“复制从站选项和变量”)。当一个从设备也充当链接复制中的其他从设备的主设备时,就完成了这个任务。
您可以使用该RESET MASTER语句或其子集删除所有二进制日志文件
PURGE BINARY LOGS。请参见
第13.7.6.6节“RESET语法”和第13.4.1.1节“PURGE BINARY LOGS语法”。
如果您正在使用复制,则不应删除主服务器上的旧二进制日志文件,除非您确定没有从服务器仍需要使用它们。例如,如果你的奴隶从未运行超过三天,一天一次,你可以在主服务器上执行mysqladmin flush-logs,然后删除超过三天的任何日志。您可以手动删除这些文件,但最好使用它PURGE BINARY
LOGS,它也可以安全地为您更新二进制日志索引文件(并且可以采用日期参数)。请参见
第13.4.1.1节“PURGE BINARY LOGS语法”。
您可以使用mysqlbinlog实用程序显示二进制日志文件的内容 。当您想要重新处理日志中的语句以进行恢复操作时,这非常有用。例如,您可以从二进制日志更新MySQL服务器,如下所示:
外壳> mysqlbinlog log_file | mysql -h server_name
mysqlbinlog也可用于显示复制从属中继日志文件的内容,因为它们使用与二进制日志文件相同的格式进行编写。有关 mysqlbinlog实用程序以及如何使用它的更多信息,请参见 第4.6.7节“ mysqlbinlog - 处理二进制日志文件的实用程序”。有关二进制日志和恢复操作的更多信息,请参见 第7.5节“使用二进制日志进行时间点恢复(增量)”。
二进制日志记录在语句或事务完成后,但在任何锁定被释放或任何提交完成之前立即完成。这可确保日志按提交顺序进行记录。
非事务表的更新在执行后立即存储在二进制日志中。
在未提交的事务中,更改事务表(例如表)的所有更新(UPDATE,
DELETE或
INSERT)将InnoDB被缓存,直到COMMIT服务器接收到一条
语句。此时,mysqld在COMMIT执行之前将整个事务写入二进制日志
。
对非事务表的修改无法回滚。如果回退的事务包括对非事务表的修改,则整个事务最后会记录一条
ROLLBACK
语句以确保对这些表的修改得到复制。
当处理事务的线程开始时,它将缓冲区分配binlog_cache_size给缓冲区语句。如果一个语句大于这个,该线程将打开一个临时文件来存储该事务。当线程结束时,临时文件被删除。
所述Binlog_cache_use状态变量表明,用这种缓冲液(和可能的一个临时文件),用于存储语句事务的数目。该
Binlog_cache_disk_use状态变量显示许多这些交易实际上是如何不得不使用临时文件。这两个变量可用于调整
binlog_cache_size到足够大的值,以避免使用临时文件。
所述max_binlog_cache_size系统变量(默认4GB,这也是最大)可被用来限制用于高速缓存的多语句事务的总大小。如果一个事务大于这么多字节,它会失败并回滚。最小值是4096。
如果您使用二进制日志和基于行的日志记录,则并发插入将转换为正常的插入CREATE ...
SELECT或
INSERT ...
SELECT语句。这样做是为了确保您可以通过在备份操作期间应用日志来重新创建表的精确副本。如果您使用基于语句的日志记录,则原始语句将写入日志。
二进制日志格式有一些已知的限制,可能会影响从备份恢复。请参见第16.4.1节“复制功能和问题”。
存储程序的二进制日志记录按 第23.7节“存储程序的二进制日志记录”中所述完成。
请注意,由于复制的增强,二进制日志格式在MySQL 5.7与以前版本的MySQL中有所不同。请参见第16.4.2节“MySQL版本之间的复制兼容性”。
写入二进制日志文件和二进制日志索引文件的处理方式与写入MyISAM
表的方式相同。请参见第B.5.3.4节“MySQL如何处理整个磁盘”。
默认情况下,二进制日志在每次write(sync_binlog=1)时同步到磁盘。如果
sync_binlog未启用,并且操作系统或计算机(不仅是MySQL服务器)崩溃,则可能会丢失二进制日志的最后一条语句。为防止出现这种情况,请sync_binlog在每个N提交组之后启用
系统变量以将二进制日志同步到磁盘
。请参见
第5.1.5节“服务器系统变量”。最安全的值
sync_binlog是1(默认值),但这也是最慢的。
例如,如果您正在使用InnoDB表并且MySQL服务器处理COMMIT
语句,则会将许多准备好的事务顺序写入二进制日志,同步二进制日志,然后将此事务提交到中InnoDB。如果服务器在这两个操作之间崩溃,则InnoDB在重新启动时回滚该事务
,但仍然存在于二进制日志中。假设这个问题被解决
--innodb_support_xa,默认设置为1。虽然这个选项与支持XA交易有关InnoDB它还确保二进制日志和InnoDB数据文件同步。为了提供更高级别的安全性,MySQL服务器还应配置为InnoDB在提交事务之前将二进制日志和日志同步
到磁盘。该InnoDB日志默认同步的,并且sync_binlog=1可用于二进制日志同步。这个选项的作用是,在崩溃后重启时,在事务回滚之后,MySQL服务器扫描最新的二进制日志文件以收集事务xid值并计算二进制日志文件中的最后有效位置。MySQL服务器然后告诉InnoDB完成任何已成功写入二进制日志的准备事务,并将二进制日志截断到最后一个有效位置。这可确保二进制日志反映InnoDB表的确切数据
,因此从服务器与主服务器保持同步,因为它不会收到已回退的语句。
innodb_support_xa已弃用,将在未来版本中删除。
InnoDB对于XA事务中的两阶段提交的支持始终从MySQL 5.7.10开始启用。
如果MySQL服务器在崩溃恢复时发现二进制日志比它本应该短,它至少缺少一个成功提交的InnoDB事务。如果sync_binlog=1磁盘/文件系统在被请求(某些时不会)时执行实际同步,则不应该发生这种情况,因此服务器会输出错误消息。在这种情况下,此二进制日志不正确,应从主数据的新快照重新启动复制。
The
binary log file_name is shorter than
its expected size
在解析二进制日志时,以下系统变量的会话值将写入二进制日志并由复制从属服务器执行:
服务器使用多种记录格式在二进制日志中记录信息。确切的格式取决于正在使用的MySQL版本。有三种日志格式:
MySQL中的复制功能最初是基于从主机到从机的SQL语句的传播。这被称为基于语句的日志记录。您可以通过启动服务器来使用此格式
--binlog-format=STATEMENT。
在基于行的日志记录中,主服务器将事件写入二进制日志,以指示单个表行如何受到影响。因此,表总是使用主键来确保行可以被有效识别,这一点很重要。您可以通过启动该服务器来使服务器使用基于行的日志记录
--binlog-format=ROW。
第三个选项也是可用的:混合记录。对于混合日志记录,缺省情况下使用基于语句的日志记录,但在某些情况下,日志记录模式会自动切换为基于行的,如下所述。您可以通过使用该选项
启动mysqld来使MySQL明确使用混合日志记录--binlog-format=MIXED。
记录格式也可以由正在使用的存储引擎设置或限制。这有助于消除在使用不同存储引擎的主服务器和从服务器之间复制某些语句时的问题。
使用基于语句的复制时,复制非确定性语句可能存在问题。在决定给定语句是否对基于语句的复制是安全的时,MySQL决定它是否可以保证可以使用基于语句的日志记录来复制语句。如果MySQL无法做出这种保证,它会将该语句标记为可能不可靠并发出警告,Statement可能不安全以登录语句格式。
您可以通过使用MySQL的基于行的复制来避免这些问题。
您可以通过启动MySQL服务器来显式选择二进制日志记录格式
。支持的值为:
--binlog-format=typetype
STATEMENT 导致日志记录为基础。
ROW 导致日志记录为基于行。
MIXED 导致日志记录使用混合格式。
记录格式也可以在运行时切换。设置binlog_format系统变量的全局值
以指定更改后连接的客户端的格式:
mysql>SET GLOBAL binlog_format = 'STATEMENT';mysql>SET GLOBAL binlog_format = 'ROW';mysql>SET GLOBAL binlog_format = 'MIXED';
单个客户端可以通过设置会话值来控制自己的语句的日志格式
binlog_format:
mysql>SET SESSION binlog_format = 'STATEMENT';mysql>SET SESSION binlog_format = 'ROW';mysql>SET SESSION binlog_format = 'MIXED';
每个MySQL服务器都可以设置自己的和唯一的二进制日志记录格式(无论是否
binlog_format设置了全局或会话范围)。这意味着更改复制主服务器上的日志记录格式不会导致从服务器更改其日志记录格式以匹配。(使用
STATEMENT模式时,
binlog_format系统变量不会被复制;使用MIXED或
ROW记录模式时,它将被复制,但被从属设备忽略)。在复制正在进行时更改主站上的二进制记录格式,或者也不需要在从站上进行更改可能导致复制失败,并出现错误,如执行行事件时出错:'无法执行语句:由于语句是行格式和BINLOG_FORMAT = STATEMENT,因此无法写入二进制日志。'
要更改全局或会话
binlog_format值,您必须具有该SUPER权限。
客户端可能希望按每个会话设置二进制日志记录的原因有几个:
会对数据库进行很多小改动的会话可能需要使用基于行的日志记录。
执行与WHERE子句中的许多行匹配的更新的会话
可能需要使用基于语句的日志记录,因为记录少数几条语句比多行更有效。
某些语句需要在主服务器上执行很多时间,但会导致只修改几行。因此使用基于行的日志记录复制它们可能是有益的。
在运行时无法切换复制格式时有例外:
从存储的函数或触发器中
如果NDB存储引擎已启用
如果会话当前处于基于行的复制模式并且已打开临时表
试图在任何这些情况下切换格式都会导致错误。
如果您正在使用InnoDB表并且事务隔离级别为READ
COMMITTED或READ
UNCOMMITTED,则只能使用基于行的日志记录。这是
可能的更改日志格式
STATEMENT,但在运行时这样做会导致非常迅速地错误,因为InnoDB不能再进行插入。
如果存在任何临时表,则不建议在运行时切换复制格式,因为只有在使用基于语句的复制时记录临时表,而使用基于行的复制时则不记录它们。通过混合复制,通常会记录临时表; 用户定义函数(UDF)和函数发生异常
UUID()。
将二进制日志格式设置为ROW,使用基于行的格式将许多更改写入二进制日志。但是,有些更改仍然使用基于声明的格式。实例包括所有DDL(数据定义语言)语句,例如CREATE TABLE,
ALTER TABLE,或
DROP TABLE。
该--binlog-row-event-max-size
选项适用于能够进行基于行复制的服务器。行的大小以字节为单位存储在二进制日志中,不超过此选项的值。该值必须是256的倍数。默认值是8192。
当使用基于语句的日志记录进行复制时,如果语句的设计方式使数据修改不确定,则主服务器和从服务器上的数据可能会有所不同 ; 也就是说,它留给查询优化器的意愿。一般来说,即使在复制之外,这也不是一个好的做法。有关此问题的详细说明,请参见 第B.5.7节“MySQL中的已知问题”。
有关由复制从服务器保存的日志的信息,请参见 第16.2.4节“复制中继和状态日志”。
以MIXED日志格式运行时,服务器在以下情况下自动从基于语句的行切换到基于行的日志记录:
当一个函数包含时
UUID()。
当一个或多个包含
AUTO_INCREMENT列的表被更新并且触发器或存储函数被调用时。像所有其他不安全的语句一样,这会在出现警告时生成警告
binlog_format = STATEMENT。
有关更多信息,请参见 第16.4.1.1节“复制和AUTO_INCREMENT”。
当视图的主体需要基于行的复制时,创建视图的语句也会使用它。例如,创建视图的语句使用该UUID()函数时会发生这种情况
。
涉及到UDF的调用时。
如果语句按行记录,并且执行该语句的会话具有任何临时表,则按行记录将用于所有后续语句(除访问临时表的那些语句外),直到删除该会话使用的所有临时表为止。
无论是否实际记录临时表,情况都是如此。
使用基于行的格式不能记录临时表; 因此,一旦使用基于行的日志记录,则使用该表的所有后续语句都是不安全的。服务器通过将会话期间执行的所有语句视为不安全,直到会话不再保存任何临时表,将近似于此条件。
何时FOUND_ROWS()或
何时ROW_COUNT()使用。(错误#12092,错误#30244)
何时USER(),,
CURRENT_USER()还是
CURRENT_USER被使用。(Bug#28086)
当一个语句引用一个或多个系统变量时。(Bug#31168)
例外。 以下系统变量与会话作用域(仅)一起使用时,不会导致记录格式切换:
有关确定系统变量作用域的信息,请参见 第5.1.6节“使用系统变量”。
有关复制如何处理的信息
sql_mode,请参见
第16.4.1.38节“复制和变量”。
当涉及的其中一个表是mysql数据库中的日志表时
。
当使用该LOAD_FILE()功能时。(错误#39701)
如果您尝试使用基于语句的日志记录来执行语句,则应该使用基于行的日志记录来生成警告。该警告显示在客户端(在输出中SHOW WARNINGS)和mysqld错误日志中。SHOW WARNINGS
每次执行这样的语句时,都会向表中添加警告。但是,只有为每个客户端会话生成警告的第一条语句才会写入错误日志以防止日志泛滥。
除了上述决定之外,单个引擎还可以确定更新表中信息时使用的记录格式。单个引擎的记录功能可以定义如下:
如果引擎支持基于行的日志记录,则该引擎被称为行日志记录功能。
如果一个引擎支持基于语句的日志记录,那么这个引擎就被说成是语句记录功能。
给定的存储引擎可以支持一种或两种日志格式。下表列出了每个引擎支持的格式。
| 存储引擎 | 行记录支持 | 支持语句记录 |
|---|---|---|
ARCHIVE |
是 | 是 |
BLACKHOLE |
是 | 是 |
CSV |
是 | 是 |
EXAMPLE |
是 | 没有 |
FEDERATED |
是 | 是 |
HEAP |
是 | 是 |
InnoDB |
是 | 是,当事务隔离级别是
REPEATABLE READ或
SERIALIZABLE; 否则没有。 |
MyISAM |
是 | 是 |
MERGE |
是 | 是 |
NDB |
是 | 没有 |
是否一个语句是要记录与要使用的根据(安全,不安全,或二进制注入)语句的类型,二进制日志记录格式(确定的记录模式STATEMENT,ROW或
MIXED),并且存储发动机的记录功能(语句能力,行能力,两者兼得或不兼容)。(二进制注入是指记录必须使用ROW格式记录的更改。)
报表可以记录,也可以不记录警告; 失败的语句不记录,但会在日志中生成错误。这在下面的决策表中显示。 Type, binlog_format, SLC和 RLC列概述了条件,而Error / Warning 和Logged as列代表相应的操作。SLC 代表“ 声明记录功能 ”, RLC代表 “ 行记录功能 ”。
| 类型 | binlog_format |
SLC | RLC | 错误/警告 | 记录为 |
|---|---|---|---|---|---|
| * | * |
没有 | 没有 | 错误:无法执行语句:由于至少涉及一个行不可行和不能声明的引擎,因此无法进行二进制日志记录。 | - |
| 安全 | STATEMENT |
是 | 没有 | - | STATEMENT |
| 安全 | MIXED |
是 | 没有 | - | STATEMENT |
| 安全 | ROW |
是 | 没有 | 错误:无法执行语句:因为BINLOG_FORMAT = ROW
至少有一个表使用无法进行基于行的日志记录的存储引擎,所以无法进行二进制日志记录。 |
- |
| 不安全 | STATEMENT |
是 | 没有 | 警告:不安全的语句以声明格式被binlogged,因为BINLOG_FORMAT =
STATEMENT |
STATEMENT |
| 不安全 | MIXED |
是 | 没有 | 错误:无法执行语句:当存储引擎仅限于基于语句的日志记录时,不可能执行不安全语句的二进制日志记录,即使
BINLOG_FORMAT = MIXED。 |
- |
| 不安全 | ROW |
是 | 没有 | 错误:无法执行语句:因为BINLOG_FORMAT = ROW
至少有一个表使用无法进行基于行的日志记录的存储引擎,所以无法进行二进制日志记录。 |
- |
| 行注入 | STATEMENT |
是 | 没有 | 错误:无法执行行注入:由于至少有一个表使用不支持基于行的日志记录的存储引擎,因此无法执行二进制日志记录。 | - |
| 行注入 | MIXED |
是 | 没有 | 错误:无法执行行注入:由于至少有一个表使用不支持基于行的日志记录的存储引擎,因此无法执行二进制日志记录。 | - |
| 行注入 | ROW |
是 | 没有 | 错误:无法执行行注入:由于至少有一个表使用不支持基于行的日志记录的存储引擎,因此无法执行二进制日志记录。 | - |
| 安全 | STATEMENT |
没有 | 是 | 错误:无法执行语句:二进制日志记录是不可能的,因为BINLOG_FORMAT =
STATEMENT至少有一个表使用不能执行基于语句的日志记录的存储引擎。 |
- |
| 安全 | MIXED |
没有 | 是 | - | ROW |
| 安全 | ROW |
没有 | 是 | - | ROW |
| 不安全 | STATEMENT |
没有 | 是 | 错误:无法执行语句:二进制日志记录是不可能的,因为BINLOG_FORMAT =
STATEMENT至少有一个表使用不能执行基于语句的日志记录的存储引擎。 |
- |
| 不安全 | MIXED |
没有 | 是 | - | ROW |
| 不安全 | ROW |
没有 | 是 | - | ROW |
| 行注入 | STATEMENT |
没有 | 是 | 错误:无法执行行注入:因为二进制日志记录是不可能的BINLOG_FORMAT =
STATEMENT。 |
- |
| 行注入 | MIXED |
没有 | 是 | - | ROW |
| 行注入 | ROW |
没有 | 是 | - | ROW |
| 安全 | STATEMENT |
是 | 是 | - | STATEMENT |
| 安全 | MIXED |
是 | 是 | - | STATEMENT |
| 安全 | ROW |
是 | 是 | - | ROW |
| 不安全 | STATEMENT |
是 | 是 | 警告:语句格式binlogged不安全的说法,因为BINLOG_FORMAT =
STATEMENT。 |
STATEMENT |
| 不安全 | MIXED |
是 | 是 | - | ROW |
| 不安全 | ROW |
是 | 是 | - | ROW |
| 行注入 | STATEMENT |
是 | 是 | 错误:无法执行行注入:二进制日志记录是不可能的,因为BINLOG_FORMAT =
STATEMENT。 |
- |
| 行注入 | MIXED |
是 | 是 | - | ROW |
| 行注入 | ROW |
是 | 是 | - | ROW |
当通过确定产生警告时,产生标准的MySQL警告(并且可用
SHOW WARNINGS)。这些信息也被写入到mysqld错误日志中。每个客户端连接的每个错误实例仅记录一个错误,以防止日志泛滥。日志消息包含尝试的SQL语句。
如果从服务器
log_error_verbosity设置为显示警告,则从设备将消息打印到错误日志中以提供有关其状态的信息,例如二进制日志和中继日志坐标,它在何处开始其作业,何时切换到另一个中继日志,何时它会在断开连接后重新连接,对基于语句的日志记录不安全的语句等等。
mysql
数据库中
授予表的内容可以直接修改(例如,用
INSERT或
DELETE)或间接修改(例如用GRANT或
CREATE USER)。影响mysql数据库表的语句使用以下规则写入二进制日志中:
mysql根据binlog_format系统变量的设置记录直接
更改数据库表中
数据的数据操作语句
。这涉及到语句,如
INSERT,
UPDATE,
DELETE,
REPLACE,
DO,
LOAD DATA
INFILE,SELECT,和
TRUNCATE TABLE。
mysql不管值的大小,间接
更改数据库的语句都会记录为语句binlog_format。这涉及语句,例如
GRANT,
REVOKE,
SET PASSWORD,
RENAME USER,
CREATE(所有形式的除外
CREATE TABLE
... SELECT), ALTER(所有形式的),和DROP(各种形式)。
CREATE TABLE ...
SELECT是数据定义和数据操作的组合。该CREATE TABLE
部分是利用语句格式记录,且
SELECT部分是根据的值记录binlog_format。
慢速查询日志由SQL语句组成,这些SQL语句花费了超过
long_query_time几秒的时间才能执行,并且至少
min_examined_row_limit需要检查行。最小值和默认值分别
long_query_time为0和10。该值可以指定为微秒的分辨率。对于记录到文件,写入时间包括微秒部分。对于记录到表中,只写入整数次; 微秒部分被忽略。
默认情况下,不会记录管理语句,也不会使用索引进行查找。这种行为可以使用log_slow_admin_statements和
更改
log_queries_not_using_indexes,如后面所述。
获取初始锁的时间不计为执行时间。mysqld在执行完所有锁之后以及在所有锁释放之后向慢查询日志写入语句,因此日志顺序可能与执行顺序不同。
默认情况下,慢查询日志被禁用。要明确指定最初的慢查询日志状态,请使用
--slow_query_log[={0|1}]。没有参数或参数为1时,
--slow_query_log启用日志。参数为0时,此选项禁用日志。要指定日志文件名称,请使用
。要指定日志目标,请使用
(如
第5.4.1节“选择常规查询和慢速查询日志输出目标”中所述)。
--slow_query_log_file=file_name--log-output
如果您为慢查询日志文件指定了没有名称,则默认名称为
。服务器在数据目录中创建文件,除非给出绝对路径名来指定不同的目录。
host_name-slow.log
要禁用或启用慢速查询日志或在运行时更改日志文件名称,请使用全局
变量slow_query_log和
slow_query_log_file系统变量。设置slow_query_log为0(或OFF)禁用日志或设为1(或
ON)启用它。设置
slow_query_log_file为指定日志文件的名称。如果日志文件已经打开,它将被关闭并打开新文件。
当启用慢查询日志时,服务器将输出写入由--log-output选项或
log_output系统变量指定的任何目标
。如果启用日志,服务器将打开日志文件并向其写入启动消息。但是,除非FILE选择了日志目标,否则不会进一步将查询记录到文件。如果目标是
NONE,即使启用了慢速查询日志,服务器也不写任何查询。如果日志目标值不包含,则设置日志文件名称对日志记录没有影响
FILE。
如果您使用该--log-short-format选项,则服务器将较少的信息写入慢速查询日志。
要在写入慢查询日志的语句中包含慢管理语句,请使用
log_slow_admin_statements系统变量。行政陈述包括
ALTER TABLE,
ANALYZE TABLE,
CHECK TABLE,
CREATE INDEX,
DROP INDEX,
OPTIMIZE TABLE,和
REPAIR TABLE。
要在写入慢速查询日志的语句中包含不使用索引进行行查询的查询,请启用
log_queries_not_using_indexes
系统变量。当记录这些查询时,慢查询日志可能会迅速增长。可以通过设置这些查询来限制这些查询
log_throttle_queries_not_using_indexes
系统变量。默认情况下,这个变量是0,这意味着没有限制。对于不使用索引的查询的日志记录,正值会限制每分钟的限制。第一个这样的查询会打开一个60秒的窗口,在该窗口中服务器将查询记录到给定的限制,然后禁止其他查询。如果在窗口结束时存在被抑制的查询,则服务器记录一个摘要,该摘要指示有多少人以及在这些人中花费的总时间。当服务器记录下一个不使用索引的查询时,下一个60秒的窗口开始。
服务器按以下顺序使用控制参数来确定是否将查询写入慢速查询日志:
查询必须不是管理语句,或者
log_slow_admin_statements
必须启用。
该查询必须至少需要
long_query_time几秒钟,或者
log_queries_not_using_indexes
必须启用该查询并且该查询对于行查找不使用索引。
查询至少必须检查
min_examined_row_limit行。
查询不能根据log_throttle_queries_not_using_indexes
设置进行抑制
。
所述log_timestamps系统变量控制在写入慢查询日志文件消息的时间戳的时区(以及到一般查询日志文件和错误日志)。它不会影响写入日志表的常规查询日志和慢速查询日志消息的时区,但可以使用CONVERT_TZ()或通过设置会话time_zone系统变量将从这些表中检索的行从本地系统时区转换为任何所需的时区
。
所有日志行都包含一个时间戳。
服务器不会将由查询缓存处理的查询写入慢速查询日志,也不会因索引的存在而受益,因为该表有零行或一行。
默认情况下,复制从服务器不会将复制查询写入慢速查询日志。要改变这个,使用
log_slow_slave_statements系统变量。
写入慢查询日志的语句中的密码被服务器重写,不会以纯文本形式出现。另请参见第6.1.2.3节“密码和记录”。
慢速查询日志可用于查找需要很长时间才能执行的查询,因此可用于优化。但是,检查一个很长的慢查询日志可能成为一项艰巨的任务。为了简化操作,可以使用mysqldumpslow命令处理缓慢的查询日志文件,以总结出现在日志中的查询。请参见 第4.6.8节“ mysqldumpslow - 汇总慢速查询日志文件”。
DDL日志或元数据日志记录由数据定义语句(如DROP TABLE和)
生成的元数据操作
ALTER TABLE。MySQL使用此日志来恢复元数据操作中发生的崩溃。当执行该语句DROP TABLE t1,
t2,我们需要确保两个t1
和t2被丢弃,并且每个表下降是完整的。这种类型的SQL语句的另一个例子是
ALTER
TABLE t3 DROP PARTITION p2,我们必须确定该分区已完全删除,并且其定义已从表的分区列表中删除
t3。
元数据操作的记录(如刚刚描述的那些)被写入到ddl_log.logMySQL数据目录中的文件中。这是一个二进制文件; 它的目的不是人类可读的,你不应该试图以任何方式修改它的内容。
ddl_log.log直到实际需要记录元数据语句时才被创建,并且在成功启动mysqld后被删除。因此,这个文件可能不会出现在以完全正常的方式运行的MySQL服务器上。
目前,ddl_log.log最多可容纳1048573个条目,大小相当于4 GB。超过此限制后,必须重新命名或删除文件,才能执行任何其他DDL语句。这是我们正在努力解决的已知问题(错误#83708)。
没有用户可配置的服务器选项或与此文件相关的变量。
如第5.4节“MySQL服务器日志”中所述,MySQL服务器可以创建多个不同的日志文件,以帮助您查看正在发生的活动。但是,您必须定期清理这些文件,以确保日志不占用太多的磁盘空间。
在启用日志记录的情况下使用MySQL时,您可能需要不时备份和删除旧的日志文件,并告诉MySQL开始记录到新文件。请参见第7.2节“数据库备份方法”。
在Linux(Red Hat)安装上,您可以使用此
mysql-log-rotate脚本。如果您从RPM分发版安装了MySQL,则应该自动安装此脚本。如果您使用二进制日志进行复制,请小心使用此脚本。除非您确定其内容已由所有从站处理,否则不应删除二进制日志。
在其他系统上,您必须自己安装一个简短的脚本,您可以从cron(或其等价物)开始处理日志文件。
对于二进制日志,您可以将expire_logs_days系统变量设置为
在给定天数后自动过期二进制日志文件(请参见第5.1.5节“服务器系统变量”)。如果您正在使用复制,则应该设置变量不低于您的奴隶可能落后于主人的最大天数。要按需删除二进制日志,请使用该PURGE
BINARY LOGS语句(请参见
第13.4.1.1节“PURGE BINARY LOGS语法”)。
您可以强制MySQL通过刷新日志来开始使用新的日志文件。发出FLUSH LOGS语句或执行
mysqladmin flush-logs,mysqladmin refresh,mysqldump --flush-logs或
mysqldump --master-data命令时会发生
日志刷新。请参见
第13.7.6.3节“FLUSH语法”,第4.5.2节“ mysqladmin - 管理MySQL服务器的客户端”和
第4.5.4节“ mysqldump - 数据库备份程序”。另外,二进制日志在其大小达到max_binlog_size系统变量的值时被刷新
。
FLUSH LOGS支持可选的修饰符,以便选择性地清除单个日志(例如,FLUSH BINARY LOGS)。
对数冲洗操作执行以下操作:
如果启用了常规查询日志记录或缓慢查询日志记录到日志文件,则服务器关闭并重新打开常规查询日志文件或慢速查询日志文件。
如果启用二进制日志记录,则服务器关闭当前的二进制日志文件并使用下一个序列号打开一个新的日志文件。
如果服务器启动时使用将
--log-error错误日志写入文件的选项,服务器将关闭并重新打开日志文件。
刷新日志时,服务器将创建一个新的二进制日志文件。但是,它只是关闭并重新打开常规和慢查询日志文件。要在Unix上创建新文件,请在刷新前重命名当前日志文件。在刷新时间,服务器以原始名称打开新的日志文件。例如,如果通用和慢查询日志文件被命名为
mysql.log和
mysql-slow.log,你可以使用一系列这样的命令:
shell> shell> shell> shell>cdmysql-data-directorymv mysql.log mysql.oldmv mysql-slow.log mysql-slow.oldmysqladmin flush-logs
在Windows上,使用重命名而不是 mv。
在这一点上,你可以备份
mysql.old和
mysql-slow.old再从磁盘删除它们。
如果有错误日志文件,可以使用类似的策略来备份错误日志文件。
您可以通过禁用日志来在运行时重命名常规查询日志或慢速查询日志:
SET GLOBAL general_log ='OFF'; SET GLOBAL slow_query_log ='OFF';
在禁用日志的情况下,从外部重命名日志文件; 例如,从命令行。然后再次启用日志:
SET GLOBAL general_log ='ON'; SET GLOBAL slow_query_log ='ON';
此方法适用于任何平台,不需要重新启动服务器。
为使服务器在外部重命名文件后重新创建给定的日志文件,文件位置必须可由服务器写入。这可能并非总是如此。例如,在Linux上,服务器可能会将错误日志写为
/var/log/mysqld.log,其中
由mysqld/var/log拥有
root且不可写
。在这种情况下,日志刷新操作将无法创建新的日志文件。
要处理这种情况,必须在重命名原始日志文件后手动创建具有正确所有者的新日志文件。例如,执行这些命令为
root:
shell>mv /var/log/mysqld.log /var/log/mysqld.log.oldshell>install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log
MySQL支持一个可以创建服务器组件的插件API。可以在服务器启动时加载插件,或者在运行时加载和卸载插件,而无需重新启动服务器。此接口支持的组件包括但不限于存储引擎,INFORMATION_SCHEMA表,全文分析器插件,分区支持和服务器扩展。
MySQL发行版包含几个实现服务器扩展的插件:
用于验证客户端连接到MySQL服务器的尝试的插件。插件可用于多种认证协议。参见第6.3.9节“可插入认证”。
一个连接控制插件,使管理员能够在一定数量的连续失败的客户端连接尝试后引入延时。请参见 第6.5.2节“连接控制插件”。
密码验证插件实现密码强度策略并评估潜在密码的强度。请参见 第6.5.3节“密码验证插件”。
通过组复制,您可以跨一组MySQL服务器实例创建高度可用的分布式MySQL服务,并且数据一致性,冲突检测和解决以及组内成员服务都是内置的。请参阅 第17章,组复制。
MySQL企业版包含一个线程池插件,通过高效地管理大量客户端连接的语句执行线程来管理连接线程,从而提高服务器性能。请参见第5.5.3节“MySQL企业线程池”。
MySQL企业版包含一个审计插件,用于监视和记录连接和查询活动。请参见第6.5.5节“MySQL企业审计”。
MySQL企业版包括一个防火墙插件,它实现了应用程序级别的防火墙,使数据库管理员可以根据与接受的语句模式的白名单进行匹配来允许或拒绝执行SQL语句。请参见 第6.5.6节“MySQL企业防火墙”。
查询重写插件检查MySQL服务器收到的语句,并可能在服务器执行它们之前重写它们。请参见第5.5.4节“重写器查询重写插件”
版本令牌允许创建应用程序可以使用的服务器令牌并对其进行同步,以防止访问不正确或过时的数据。版本令牌基于实现version_tokens插件和一组用户定义函数的插件库
。请参见第5.5.5节“版本令牌”。
密钥环插件为敏感信息提供安全存储。请参见第6.5.4节“MySQL Keyring”。
X插件扩展MySQL服务器以能够作为文档存储。运行X插件可使MySQL服务器使用X协议与客户端通信,该协议旨在将MySQL的ACID兼容存储功能作为文档存储。请参见第19.7节“X插件”。
半同步复制插件实现复制功能的接口,只要至少有一个从站响应每个事务,就允许主站继续进行。请参见第16.3.9节“半同步复制”。
测试框架插件测试服务器服务。有关这些插件的信息,请参阅 测试插件服务的插件。
以下各节介绍如何安装和卸载插件,以及如何在运行时确定安装哪些插件并获取有关插件的信息。有关编写插件的信息,请参见第28.2节“MySQL插件API”。
服务器插件必须先加载到服务器才能使用。MySQL在服务器启动和运行时支持插件加载。也可以在启动时控制加载插件的激活状态,并在运行时卸载它们。
加载插件时,有关它的信息在运行时可从
INFORMATION_SCHEMA.PLUGINS表和SHOW PLUGINS语句中获得。请参见
第5.5.2节“获取服务器插件信息”。
在使用服务器插件之前,必须使用以下方法之一安装服务器插件。在说明中,
plugin_name表示插件的名称,例如innodb,csv或
validate_password。
内置插件:
服务器会自动识别内置的插件。通常,服务器在启动时启用该插件。一些内置的插件允许用这个
选项来改变它
。
--plugin_name[=activation_state]
在mysql.plugin系统表中注册的插件
:
该mysql.plugin表充当插件的注册表(除了内置插件,不需要注册)。启动时,服务器加载表中列出的每个插件。通常,对于从mysql.plugin表中加载的插件
,服务器还会启用该插件。这可以通过
选项进行更改
。
--plugin_name[=activation_state]
如果服务器使用该--skip-grant-tables选项启动
,它不会查询mysql.plugin表格,也不会加载列表中列出的插件。
使用命令行选项命名的插件:
位于插件库文件中的插件可以在与服务器启动时加载
--plugin-load,
--plugin-load-add或(如MySQL的5.7.11)的--early-plugin-load
选项。通常,对于启动时加载的插件,服务器还会启用该插件。这可以通过
选项进行更改
。
--plugin_name[=activation_state]
在--plugin-load和
--plugin-load-add选项加载插件内置后的插件和存储引擎在服务器启动时已经初始化。该
--early-plugin-load选项用于加载在内置插件和存储引擎初始化之前必须可用的插件。
每个插件加载选项的值都是以分号分隔的列表
和值。每个
都是要加载的插件的名称,并且是包含插件代码的库文件的名称。如果插件库的名称没有任何前面的插件名称,则服务器会加载库中的所有插件。服务器在由系统变量命名的目录中查找插件库文件
。
name=plugin_libraryplugin_librarynameplugin_libraryplugin_dir
插件加载选项不会在mysql.plugin表中注册任何插件
。对于后续的重新启动,服务器再次加载插件只有当
--plugin-load,
--plugin-load-add或
--early-plugin-load再次给出。也就是说,该选项会生成一次性插件安装操作,该操作会持续执行单个服务器调用。
--plugin-load,
--plugin-load-add并且
--early-plugin-load即使--skip-grant-tables给出插件也可以加载
(这会导致服务器忽略该
mysql.plugin表)。
--plugin-load,
--plugin-load-add并且
--early-plugin-load还允许在启动时加载插件,这些插件无法在运行时加载。
该--plugin-load-add选项补充了--plugin-load
选项:
每个实例
--plugin-load都会重置要在启动时加载的一组插件,而
--plugin-load-add将一个插件或插件添加到要加载的插件集而不重置当前设置。因此,如果--plugin-load
指定了多个实例,则只有最后一个生效。对于多个实例
--plugin-load-add,它们全部生效。
参数格式与for相同
--plugin-load,但--plugin-load-add可以使用多个实例
来避免将大量插件指定为一个冗长笨拙的--plugin-load
参数。
--plugin-load-add可以在没有的情况下给出
--plugin-load,但是--plugin-load-add
之前出现的
任何实例--plugin-load都不起作用,因为--plugin-load重置要加载的一组插件。
例如,这些选项:
--plugin-load = x --plugin-load-add = y
相当于这个选项:
--plugin负载= “X; Y”
但是这些选项:
--plugin-load-add = y --plugin-load = x
相当于这个选项:
--plugin负荷= X
INSTALL PLUGIN
声明中安装的插件
:
位于插件库文件中的插件可以在运行时用该INSTALL PLUGIN
语句加载。该语句还将mysql.plugin表中的插件注册,
以使服务器在后续重新启动时加载它。出于这个原因,
INSTALL PLUGIN需要表格的
INSERT特权
mysql.plugin。
插件库文件的基本名称取决于您的平台。常见的后缀用于Windows的.soUnix和类Unix系统.dll。
示例:该--plugin-load选项在服务器启动时安装插件。要安装名为
myplugin插件库文件的插件
somepluglib.so,请在my.cnf文件中使用以下行
:
的[mysqld] 插件负载=为myplugin = somepluglib.so
在这种情况下,插件没有注册
mysql.plugin。在没有该--plugin-load选项的情况下重新启动服务器会导致插件无法在启动时加载。
或者,该INSTALL PLUGIN
语句会导致服务器在运行时从库文件加载插件代码:
安装插件myplugin SONAME'somepluglib.so';
INSTALL PLUGIN也会导致
“ 永久 ”插件注册:mysql.plugin表中列出了该插件以确保服务器在后续重新启动时加载该插件。
许多插件可以在服务器启动时或运行时加载。但是,如果插件的设计必须在服务器启动期间加载并初始化,则尝试在运行时加载它会INSTALL
PLUGIN产生错误:
MySQL的> INSTALL PLUGIN myplugin SONAME 'somepluglib.so';
错误1721(HY000):插件'myplugin'被标记为不动态
安装。你必须停止服务器来安装它。
在这种情况下,你必须使用
--plugin-load,
--plugin-load-add或
--early-plugin-load。
如果一个插件在表中使用a --plugin-load,
--plugin-load-add或
--early-plugin-load选项和(作为较早INSTALL
PLUGIN语句的结果)
命名
mysql.plugin,则服务器启动,但将这些消息写入错误日志:
[错误]功能'plugin_name'已经存在 [警告]无法加载名为“plugin_name'的插件 与soname'plugin_object_file'。
如果服务器在启动时知道插件(例如,因为插件使用--plugin-load选项命名
或在mysql.plugin表中注册),则服务器默认加载并启用插件。这是可能使用,以控制激活状态对于这样的插件
启动选项,其中是插件的影响名称,如
,,或
。与其他选项一样,破折号和下划线在选项名称中可以互换。另外,激活状态值不区分大小写。例如,并且
是等同的。
--plugin_name[=activation_state]plugin_nameinnodbcsvvalidate_password--my_plugin=ON--my-plugin=on
--
plugin_name=OFF
通知服务器禁用该插件。这可能不适用于某些内置插件,例如
mysql_native_password。
--
plugin_name[=ON]
通知服务器启用该插件。(将该选项指定为
不带值具有相同的效果。)如果插件未能初始化,则服务器将在禁用插件的情况下运行。
--plugin_name
--
plugin_name=FORCE
告诉服务器启用插件,但是如果插件初始化失败,服务器不会启动。换句话说,这个选项强制服务器在插件启用或者根本不运行的情况下运行。
--
plugin_name=FORCE_PLUS_PERMANENT
就像FORCE,但另外防止插件在运行时被卸载。如果用户尝试这样做UNINSTALL PLUGIN,则会发生错误。
插件激活状态LOAD_OPTION在INFORMATION_SCHEMA.PLUGINS表格的列
中可见
。
假设CSV,
BLACKHOLE以及ARCHIVE都内置可插拔存储引擎以及您希望服务器在启动时加载它们,受以下条件:服务器被允许运行,如果CSV初始化失败,必须要求BLACKHOLE
初始化成功,并应禁用
ARCHIVE。要做到这一点,请在选项文件中使用这些行:
的[mysqld] CSV = ON 黑洞= FORCE 存档= OFF
该
选项的格式是一个同义词
。在
和
选项格式是同义词
。
--enable-plugin_name--plugin_name=ON--disable-plugin_name--skip-plugin_name--plugin_name=OFF
如果某个插件被禁用,无论是显式使用
OFF还是隐式使用,因为它已启用
ON但未初始化,那么需要该插件的服务器操作方面将会更改。例如,如果插件实现存储引擎,则存储引擎的现有表变得不可访问,并且尝试为存储引擎创建新表会导致使用默认存储引擎的表,除非NO_ENGINE_SUBSTITUTION启用了
SQL模式以导致错误反而发生。
禁用插件可能需要对其他选项进行调整。例如,如果使用--skip-innodb
禁用启动服务器,则启动时
可能需要省略InnoDB其他
选项。另外,因为是默认存储引擎,所以除非您指定另一个可用存储引擎,否则它不会启动
。你还必须设置
。
innodb_xxxInnoDB--default_storage_engine--default_tmp_storage_engine
在运行时,该UNINSTALL PLUGIN
语句禁用并卸载服务器已知的插件。该语句将卸载该插件并将其从mysql.plugin表中删除
,如果它在那里注册的话。出于这个原因,UNINSTALL
PLUGIN声明需要DELETE该mysql.plugin表的
特权
。如果插件不再注册在表中,服务器将不会自动加载插件以供后续重新启动。
UNINSTALL PLUGIN可以卸载插件,无论它是在运行时加载
INSTALL PLUGIN还是在启动时加载插件加载选项,但要受以下条件限制:
它无法卸载内置于服务器的插件。这些可以被识别为那些NULL在INFORMATION_SCHEMA.PLUGINSor
的输出
中具有库名称的库
SHOW PLUGINS。
它不能卸载服务器启动的
插件,这会阻止插件在运行时卸载。这些可以从
表格的列中确定。
--plugin_name=FORCE_PLUS_PERMANENTLOAD_OPTIONINFORMATION_SCHEMA.PLUGINS
要使用插件加载选项卸载当前在服务器启动时加载的插件,请使用此过程。
从my.cnf文件中删除与该插件相关的任何选项
。
重新启动服务器。
插件通常在启动时或INSTALL
PLUGIN运行时使用插件加载选项安装,但不能同时安装。但是,从my.cnf
文件中删除插件的选项可能不足以将其卸载,如果在某些时候
INSTALL PLUGIN也被使用过。如果该插件仍然出现在INFORMATION_SCHEMA.PLUGINSor
的输出中
SHOW PLUGINS,则使用
UNINSTALL PLUGIN它将其从mysql.plugin表格中删除。然后重新启动服务器。
有几种方法可以确定服务器中安装了哪些插件:
该INFORMATION_SCHEMA.PLUGINS
表为每个加载的插件包含一行。任何
PLUGIN_LIBRARY有价值的
NULL内置内置,并且不能卸载。
MySQL的> SELECT * FROM information_schema.PLUGINS\G
*************************** 1. row ******************** *******
PLUGIN_NAME:binlog
PLUGIN_VERSION:1.0
PLUGIN_STATUS:ACTIVE
PLUGIN_TYPE:存储引擎
PLUGIN_TYPE_VERSION:50158.0
PLUGIN_LIBRARY:NULL
PLUGIN_LIBRARY_VERSION:NULL
PLUGIN_AUTHOR:MySQL AB
PLUGIN_DESCRIPTION:这是一个伪存储引擎来表示事务中的二进制日志
PLUGIN_LICENSE:GPL
LOAD_OPTION:FORCE
...
*************************** 10. row ******************** *******
PLUGIN_NAME:InnoDB
PLUGIN_VERSION:1.0
PLUGIN_STATUS:ACTIVE
PLUGIN_TYPE:存储引擎
PLUGIN_TYPE_VERSION:50158.0
PLUGIN_LIBRARY:ha_innodb_plugin.so
PLUGIN_LIBRARY_VERSION:1.0
PLUGIN_AUTHOR:Innobase Oy
PLUGIN_DESCRIPTION:支持事务,行级锁定,
和外键
PLUGIN_LICENSE:GPL
LOAD_OPTION:ON
...
该SHOW PLUGINS语句为每个加载的插件显示一行。任何
Library有价值的NULL
内置内置,不能卸载。
MySQL的> SHOW PLUGINS\G
*************************** 1. row ******************** *******
名称:binlog
状态:ACTIVE
类型:存储引擎
库:NULL
许可证:GPL
...
*************************** 10. row ******************** *******
名称:InnoDB
状态:ACTIVE
类型:存储引擎
库:ha_innodb_plugin.so
许可证:GPL
...
该mysql.plugin表显示哪些插件已注册INSTALL
PLUGIN。该表仅包含插件名称和库文件名,所以它不提供与PLUGINS表或
SHOW PLUGINS语句一样多的信息。
MySQL企业线程池是包含在MySQL企业版中的一个扩展,这是一个商业产品。要了解有关商业产品的更多信息, 请访问http://www.mysql.com/products/。
从MySQL 5.7.9开始,MySQL企业版包含MySQL企业线程池,使用服务器插件实现。MySQL服务器中的默认线程处理模型执行每个客户端连接使用一个线程的语句。随着更多客户端连接到服务器并执行语句,整体性能下降。线程池插件提供了另一种线程处理模型,旨在减少开销并提高性能。该插件实现了一个线程池,该线程池通过高效地管理大量客户端连接的语句执行线程来提高服务器性能。
线程池解决了每个连接模型的一个线程的几个问题:
线程堆栈过多使得CPU高速缓存在高度并行执行工作负载中几乎无用。线程池促进线程堆栈重用以最小化CPU高速缓存占用空间。
由于太多的线程并行执行,上下文切换开销很高。这也给操作系统调度程序带来了具有挑战性的任务。线程池控制活动线程的数量,以保持MySQL服务器内的并行性处于可以处理的级别,并且适用于执行MySQL的服务器主机。
并行执行的事务太多会增加资源争用。在这里InnoDB,这增加了中央互斥锁的时间。线程池控制事务何时开始,以确保并行执行不太多。
线程池插件仅包含在MySQL企业版中。它不包含在MySQL社区发行版中。
在Windows上,线程池插件需要Windows Vista或更高版本。在Linux上,该插件需要内核2.6.9或更高版本。
第A.14节“MySQL 5.7 FAQ:MySQL企业线程池”
线程池功能包含以下组件:
插件库文件包含用于多个INFORMATION_SCHEMA表的线程池代码和插件的插件
。
有关线程池如何工作的详细说明,请参见 第5.5.3.3节“线程池操作”。
该INFORMATION_SCHEMA表被命名为
TP_THREAD_STATE,
TP_THREAD_GROUP_STATE和
TP_THREAD_GROUP_STATS。这些表提供了有关线程池操作的信息。有关更多信息,请参见
第24.32节“线程池INFORMATION_SCHEMA表”。
几个系统变量与线程池相关。该
thread_handling系统变量的值,
loaded-dynamically当服务器成功加载线程池插件。
其他相关变量由线程池插件实现; 除非启用,否则它们不可用:
thread_pool_algorithm:用于调度的并发算法。
thread_pool_high_priority_connection:如何为会话安排语句执行。
thread_pool_prio_kickup_timer:在线程池将等待执行的语句从低优先级队列移至高优先级队列之前多长时间。
thread_pool_max_unused_threads:有多少个睡眠线程允许。
thread_pool_size:线程池中的线程组数量。这是控制线程池性能的最重要的参数。
thread_pool_stall_limit:执行语句被视为停止之前的时间。
如果启动时插件实现的任何变量设置为非法值,则插件初始化失败,插件不加载。
有关设置线程池参数的信息,请参见 第5.5.3.4节“线程池调整”。
性能架构公开有关线程池的信息,并可用于调查操作性能。有关更多信息,请参见 第25章MySQL性能架构。
本节介绍如何安装MySQL企业线程池。有关安装插件的一般信息,请参见 第5.5.1节“安装和卸载插件”。
为了供服务器使用,插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。如有必要,请设置plugin_dir服务器启动时的值
以告知服务器插件目录位置。
插件库文件的基本名称是
thread_pool。每个平台的文件名后缀都不相同(例如,.so对于Unix和类Unix系统,.dll对于Windows)。
要启用线程池功能,请使用--plugin-load-add选项启动服务器来加载要使用的插件
。例如,如果只命名插件库文件,服务器将加载它包含的所有插件(即线程池插件和所有INFORMATION_SCHEMA
表)。为此,请将这些行放在
my.cnf文件中(.so根据需要调整平台的
后缀):
的[mysqld] 插件的负载加= thread_pool.so
这相当于通过单独命名它们来加载所有线程池插件:
的[mysqld] 插件的负载加= thread_pool = thread_pool.so; tp_thread_state = thread_pool.so; tp_thread_group_state = thread_pool.so; tp_thread_group_stats = thread_pool.so
有了--plugin-load-add,所有的插件都不需要在一行上命名。要使选项文件更易于阅读,请使用多个
--plugin-load-add选项分别命名插件:
的[mysqld] 插件的负载加= thread_pool = thread_pool.so 插件的负载加= tp_thread_state = thread_pool.so 插件的负载加= tp_thread_group_state = thread_pool.so 插件的负载加= tp_thread_group_stats = thread_pool.so
如果需要,您可以从库文件中加载各个插件。要加载线程池插件而不是
INFORMATION_SCHEMA表,请使用如下所示的选项:
的[mysqld] 插件的负载加= thread_pool = thread_pool.so
要加载线程池插件并仅加载
表,请使用如下所示的选项:
TP_THREAD_STATE
INFORMATION_SCHEMA
的[mysqld] 插件的负载加= thread_pool = thread_pool.so; tp_thread_state = thread_pool.so
如果您没有加载所有
INFORMATION_SCHEMA表,则部分或全部MySQL企业监视器线程池图将为空。
要验证插件安装,请检查该
INFORMATION_SCHEMA.PLUGINS表或使用该SHOW PLUGINS语句(请参见第5.5.2节“获取服务器插件信息”)。例如:
MySQL的>SELECT PLUGIN_NAME, PLUGIN_STATUSFROM INFORMATION_SCHEMA.PLUGINSWHERE PLUGIN_NAME LIKE 'thread%' OR PLUGIN_NAME LIKE 'tp%';+ ----------------------- + -------- + | PLUGIN_NAME | PLUGIN_STATUS | + ----------------------- + -------- + | thread_pool | ACTIVE | | TP_THREAD_STATE | ACTIVE | | TP_THREAD_GROUP_STATE | ACTIVE | | TP_THREAD_GROUP_STATS | ACTIVE | + ----------------------- + -------- +
如果插件未能初始化,请检查服务器错误日志以获取诊断消息。
如果服务器成功加载线程池插件,它将设置thread_handling系统变量
loaded-dynamically。
线程池由多个线程组组成,每个线程组管理一组客户端连接。在建立连接时,线程池以循环方式将它们分配给线程组。
线程组的数量可以使用thread_pool_size系统变量进行配置
。组的默认数量是16.有关设置此变量的指导,请参见第5.5.3.4节“线程池调整”。
每个组的最大线程数是4096(或者在某些系统内部使用一个线程时为4095)。
线程池分离连接和线程,因此连接和执行从这些连接收到的语句的线程之间没有固定的关系。这不同于将一个线程与一个连接关联的默认线程处理模型,以便线程执行连接中的所有语句。
线程池试图确保每个组在任何时候最多执行一个线程,但有时会允许更多线程临时执行以获得最佳性能。该算法按以下方式工作:
每个线程组都有一个侦听器线程,用于侦听分配给该组的连接的传入语句。当语句到达时,线程组立即开始执行它或将其排入队列以供稍后执行:
如果语句是唯一收到的语句并且没有语句排队或当前正在执行,则立即执行。
如果语句无法立即开始执行,则会发生排队。
如果立即执行,则执行由侦听器线程执行。(这意味着组中暂时没有线程在监听。)如果语句快速结束,执行线程返回到侦听语句。否则,线程池会将该语句视为已停止,并将另一个线程作为侦听器线程(如果需要,将其创建)。为了确保没有线程组被阻塞的语句阻塞,线程池具有后台线程,该线程池定期监视线程组状态。
通过使用监听线程执行可立即开始的语句,如果语句快速结束,则不需要创建额外的线程。这确保了在少量并发线程的情况下可以实现最有效的执行。
当线程池插件启动时,它会为每个组(侦听器线程)创建一个线程以及后台线程。根据需要创建其他线程来执行语句。
thread_pool_stall_limit
系统变量
的值
决定了前一项中“ 快速结束 ”的含义。在线程被视为暂停之前的默认时间为60毫秒,但可以设置为最多6秒。此参数可配置为使您能够达到适合服务器工作负载的平衡。短的等待值允许线程更快地启动。短值也可以更好地避免死锁情况。对于包含长时间运行语句的工作负载来说,长等待值非常有用,可以避免在当前执行语句时启动太多新语句。
线程池着重于限制并发的短期运行语句的数量。在执行语句到达停止时间之前,它会阻止其他语句开始执行。如果语句执行超出停滞时间,则允许继续,但不再阻止其他语句启动。通过这种方式,线程池试图确保在每个线程组中不会有多个短语句,尽管可能会有多个长时间运行的语句。让长时间运行的语句阻止其他语句执行是不可取的,因为可能需要等待的数量没有限制。例如,
如果遇到磁盘I / O操作或用户级别锁定(行锁定或表锁定),语句会被阻止。该块会导致线程组变为未使用状态,因此会对线程池进行回调以确保线程池可以立即启动该组中的新线程以执行另一个语句。当被阻塞的线程返回时,线程池允许它立即重启。
有两个队列,一个高优先级队列和一个低优先级队列。事务中的第一条语句转到低优先级队列。如果事务正在进行(对于它的语句已开始执行),则事务的以下任何语句将转至高优先级队列,否则转至低优先级队列。通过启用thread_pool_high_priority_connection
系统变量可以影响队列分配
,这会导致会话的所有排队语句进入高优先级队列。
对于非事务性存储引擎或autocommit启用事务引擎的
语句,将被视为低优先级语句,因为在这种情况下,每个语句都是事务。因此,考虑到
表InnoDB和MyISAM表的混合,线程池优先考虑
InnoDB那些用于MyISAM除非
autocommit被启用的那些
语句。随着
autocommit启用时,所有的语句将低优先级。
当线程组选择排队语句执行时,它首先查看高优先级队列,然后查看低优先级队列。如果找到语句,它将从队列中移除并开始执行。
如果语句停留在低优先级队列中的时间过长,则线程池将移至高优先级队列。thread_pool_prio_kickup_timer
系统变量的值
控制移动前的时间。对于每个线程组,每10毫秒或100每秒最多一条语句将从低优先级队列移至高优先级队列。
线程池重用最活跃的线程以更好地使用CPU缓存。这是一个对性能有很大影响的小调整。
线程执行用户连接中的语句时,性能模式检测会将线程活动计入用户连接。否则,Performance Schema会将活动记录到线程池中。
以下是线程组可能有多个线程开始执行语句的条件示例:
一个线程开始执行一个语句,但运行时间足够长以致被视为停滞。线程组允许另一个线程开始执行另一个语句,即使第一个线程仍在执行。
一个线程开始执行语句,然后变为阻塞并将其报告回线程池。线程组允许另一个线程开始执行另一个语句。
一个线程开始执行一个语句,变得被阻塞,但不会报告它被阻塞,因为该块不会在已用线程池回调检测的代码中发生。在这种情况下,线程显示为线程组仍然在运行。如果该块持续足够长的时间以使该语句被视为停止,则该组允许另一个线程开始执行另一个语句。
线程池被设计为在越来越多的连接中可扩展。它也被设计用来避免由于限制主动执行语句的数量而导致的死锁。重要的是不要报告回线程池的线程不会阻止其他语句执行,从而导致线程池死锁。这些陈述的例子如下:
长期运行的报表。这些会导致所有资源只被少数语句使用,并且可能会阻止所有其他人访问服务器。
二进制日志转储线程读取二进制日志并将其发送给从属服务器。这是一种长期运行的 “ 声明 ”,它运行了很长时间,并且不应阻止其他声明的执行。
行锁,表锁,睡眠或任何其他阻塞活动都会被MySQL服务器或存储引擎报告回线程池。
在每种情况下,为了防止死锁,当语句没有快速完成时,该语句会被移至停滞类别,以便线程组可以允许另一个语句开始执行。通过这种设计,当线程执行或被阻塞很长时间时,线程池会将线程移至停滞类别,并且对于语句执行的其余部分,它不会阻止其他语句执行。
可能发生的最大线程数是
max_connections和和
thread_pool_size。这可能发生在所有连接都处于执行模式并且每个组创建额外线程以侦听更多语句的情况下。这不一定是经常发生的状态,但它在理论上是可能的。
本节提供了有关设置线程池系统变量以获得最佳性能的指导,使用诸如每秒事务处理等度量标准进行衡量。
thread_pool_size是控制线程池性能的最重要的参数。它只能在服务器启动时设置。我们在测试线程池方面的经验表明如下:
如果是主存储引擎InnoDB,最佳
thread_pool_size设置可能在16到36之间,最常用的最佳值可能是24到36之间。我们还没有看到任何设置已经超过36的最佳设置。有可能是小于16的值最佳的特殊情况。
对于DBT2和Sysbench等工作负载而言,最佳工作
InnoDB似乎通常在36周左右。对于写密集型工作负载,最佳设置有时可能较低。
如果主存储引擎是
MyISAM,则该
thread_pool_size设置应该相当低。我们倾向于从4到8的值获得最佳性能。较高的值往往会对性能产生轻微的负面影响,但不会产生显着的影响。
另一个系统变量
thread_pool_stall_limit对于处理被阻塞和长时间运行的语句很重要。如果阻塞MySQL服务器的所有调用都被报告给线程池,它将始终知道执行线程何时被阻塞。但是,这可能并非总是如此。例如,块可能发生在未用线程池回调检测的代码中。对于这种情况,线程池必须能够识别看起来被阻塞的线程。这是通过超时来完成的,其长度可以使用thread_pool_stall_limit
系统变量进行调整。该参数确保服务器不会完全被阻塞。的价值
thread_pool_stall_limit 具有6秒的上限以防止死锁的服务器的风险。
thread_pool_stall_limit还使线程池能够处理长时间运行的语句。如果允许长时间运行的语句阻塞线程组,则分配给该组的所有其他连接将被阻止,并且无法在长时间运行的语句完成之前开始执行。在最坏的情况下,这可能需要几小时甚至几天。
thread_pool_stall_limit应该选择这样
的值,
使得执行时间超过其值的语句被视为停滞。由于它们涉及额外的上下文切换,并且在某些情况下甚至是额外的线程创建,因此停顿的语句会产生大量额外开销 另一方面,将thread_pool_stall_limit
参数设置
得太高意味着长时间运行的语句会阻塞大量短时间运行的语句,所需时间超过必要的时间。短的等待值允许线程更快地启动。短值也可以更好地避免死锁情况。对于包含长时间运行语句的工作负载来说,长等待值非常有用,可以避免在当前执行语句时启动太多新语句。
假设服务器执行一个工作负载,其中99.9%的语句在100ms内完成,即使服务器已加载完成,剩余的语句也会在100ms到2小时之间相当均匀地传播。在这种情况下,设置
thread_pool_stall_limit为10(意思是100ms)是有意义的。主要执行非常简单的语句的服务器的默认值为60毫秒。
该thread_pool_stall_limit
参数可以在运行时更改,以使您达到适合服务器工作负载的平衡。假设
TP_THREAD_GROUP_STATS表已启用,可以使用以下查询来确定已停止执行的语句的比例:
SELECT SUM(STALLED_QUERIES_EXECUTED)/ SUM(QUERIES_EXECUTED) FROM information_schema.TP_THREAD_GROUP_STATS;
这个数字应该尽可能低。为了减少语句停顿的可能性,增加语句的值
thread_pool_stall_limit。
当一个语句到达时,在它实际开始执行之前可以延迟的最长时间是多少?假设以下条件适用:
在低优先级队列中有200个语句排队。
在高优先级队列中有10个语句排队。
thread_pool_prio_kickup_timer
设置为10000(10秒)。
thread_pool_stall_limit 设置为100(1秒)。
在最坏的情况下,10个高优先级语句代表10个事务持续执行很长时间。因此,在最坏的情况下,没有语句会被移到高优先级队列中,因为它总是会包含等待执行的语句。10秒后,新语句有资格移动到高优先级队列。但是,在它可以被移动之前,它之前的所有语句也必须被移动。这可能需要2秒钟,因为每秒最多100条语句被移至高优先级队列。现在,当语句到达高优先级队列时,可能会有很多长时间运行的语句。在最坏的情况下,每个语句都会停顿,并且在从高优先级队列中检索下一个语句之前,每个语句需要1秒。因此,在这种情况下,新语句开始执行之前需要222秒。
这个例子显示了一个应用程序的最坏情况。如何处理它取决于应用程序。如果应用程序对响应时间有很高的要求,它应该很可能会将用户限制在较高的级别上。否则,它可以使用线程池配置参数来设置某种最大等待时间。
从MySQL 5.7.6开始,MySQL服务器支持查询重写插件,可以在服务器执行它们之前检查并可能修改服务器接收的语句。请参阅 查询重写插件。
MySQL发行包括一个名为postparse查询重写插件
Rewriter和用于安装插件及其相关组件的脚本。这些组件共同提供SELECT重写功能:
一个名为服务器端的插件Rewriter
会检查SELECT语句,并可能会根据重写规则的内存缓存重写它们。
准备好的声明中的独立SELECT
声明和SELECT声明可能会被重写。
SELECT在视图定义或存储程序中发生的声明不会被重写。
该Rewriter插件使用名为query_rewrite包含表
的数据库
rewrite_rules。该表提供了插件用于决定是否重写语句的规则的持久存储。用户通过修改该表中存储的规则集与插件进行通信。该插件通过设置message表格行的列来与用户进行通信
。
该query_rewrite数据库包含一个名为存储过程
flush_rewrite_rules()加载规则表中的内容到插件。
名为的用户定义函数
load_rewrite_rules()由
flush_rewrite_rules()存储过程使用。
该Rewriter插件公开了启用插件配置和状态变量以提供运行时操作信息的系统变量。
以下各节介绍如何安装和使用
Rewriter插件,并为其相关组件提供参考信息。
如果安装,Rewriter即使禁用,该插件也会涉及一些开销。为了避免这种开销,除非你打算使用它,否则不要安装插件。
要安装或卸载Rewriter查询重写插件,请选择位于shareMySQL安装目录中的approropriate脚本
:
install_rewriter.sql:选择此脚本来安装Rewriter插件及其关联的组件。
MySQL的5.7.8之前,有两个安装脚本,
install_rewriter.sql以及
install_rewriter_with_optional_columns.sql他们是否建立了其在不同
pattern_digest和
normalized_columns该列
rewrite_rules表。从5.7.8开始,安装脚本始终创建这些列。(有关表列的详细信息,请参见
第5.5.4.3.1节“重写器查询重写插件规则表”。)
uninstall_rewriter.sql:选择此脚本来卸载Rewriter插件及其相关组件。
按如下所示运行所选脚本:
shell>mysql -u root -p < install_rewriter.sql输入密码:(enter root password here)
这里的例子使用
install_rewriter.sql安装脚本。如果您选择不同的脚本,请进行适当的替换。
运行安装脚本应该安装并启用插件。要验证,请连接到服务器并执行以下语句:
MySQL的> SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled';
+ ------------------ + ------- +
| 变量名| 值|
+ ------------------ + ------- +
| rewriter_enabled | ON |
+ ------------------ + ------- +
有关使用说明,请参见 第5.5.4.2节“使用重写器查询重写插件”。有关参考信息,请参见 第5.5.4.3节“重写器查询重写插件参考”。
要启用或禁用插件,请启用或禁用
rewriter_enabled系统变量。默认情况下,Rewriter插件在安装时启用(请参见
第5.5.4.1节“安装或卸载重写器查询重写插件”)。要明确设置初始插件状态,可以在服务器启动时设置变量。例如,要在选项文件中启用插件,请使用以下行:
的[mysqld] rewriter_enabled = ON
也可以在运行时启用或禁用插件:
mosql>SET GLOBAL rewriter_enabled = ON;mysql>SET GLOBAL rewriter_enabled = OFF;
假设Rewriter插件已启用,它会检查并可能修改SELECT服务器收到的每个
语句。该插件根据重写规则的内存缓存决定是否重写语句,这些规则是从数据库的rewrite_rules表中加载的
query_rewrite。
要为Rewriter插件添加规则,请将行添加到rewrite_rules表中,然后调用flush_rewrite_rules()存储过程将表中的规则加载到插件中。以下示例创建一个简单的规则来匹配选择单个文字值的语句:
mysql>INSERT INTO query_rewrite.rewrite_rules (pattern, replacement)- >VALUES('SELECT ?', 'SELECT ? + 1');
生成的表格内容如下所示:
MySQL的> SELECT * FROM query_rewrite.rewrite_rules\G
*************************** 1. row ******************** *******
ID:1
模式:SELECT?
pattern_database:NULL
替换:SELECT?+ 1
启用:是
消息:NULL
pattern_digest:NULL
normalized_pattern:NULL
该规则指定一个模式模板,指示SELECT要匹配哪些
语句以及指示如何重写匹配语句的替换模板。但是,将该规则添加到
rewrite_rules表中并不足以导致Rewriter插件使用规则。您必须调用flush_rewrite_rules()才能将表内容加载到插件内存中缓存中:
MySQL的> CALL query_rewrite.flush_rewrite_rules();
如果您的重写规则似乎不能正常工作,请确保您已通过调用重新加载规则表
flush_rewrite_rules()。
当插件从规则表中读取每条规则时,它会根据模式和摘要散列值计算标准化(语句摘要)形式,并使用它们更新
normalized_pattern和
pattern_digest列:
MySQL的> SELECT * FROM query_rewrite.rewrite_rules\G
*************************** 1. row ******************** *******
ID:1
模式:SELECT?
pattern_database:NULL
替换:SELECT?+ 1
启用:是
消息:NULL
pattern_digest:46b876e64cd5c41009d91c754921f1d4
normalized_pattern:select?
有关语句摘要,规范化语句和摘要散列值的信息,请参见 第25.9节“性能模式语句摘要”。
模式使用与预处理语句相同的语法(请参见
第13.5.1节“PREPARE语法”)。在模式模板中,
?字符充当与数据值匹配的参数标记。参数标记只能用于出现数据值的地方,而不能用于SQL关键字,标识符等等。该?字符不应引号括起来。
与模式一样,替换可以包含
?字符。对于与模式模板相匹配的语句,插件会重写它,?并使用模式中相应标记匹配的数据值替换替换中的
参数标记。结果是一个完整的语句字符串。插件要求服务器解析它,并将结果作为重写语句的表示返回给服务器。
添加并加载规则后,根据语句是否符合规则模式,检查是否发生重写:
MySQL的>SELECT PI();+ ---------- + | PI()| + ---------- + | 3.141593 | + ---------- + 一排(0.01秒) MySQL的>SELECT 10;+ -------- + | 10 + 1 | + -------- + | 11 | + -------- + 1行,1警告(0.00秒)
第一个SELECT陈述没有重写,但第二个陈述确实发生了
。第二条语句说明,当
Rewriter插件重写一条语句时,它会产生一条警告消息。要查看消息,请使用
SHOW WARNINGS:
MySQL的> SHOW WARNINGS\G
*************************** 1. row ******************** *******
级别:注意
代码:1105
消息:通过查询重写插件将查询'SELECT 10'重写为'SELECT 10 + 1'
要启用或禁用现有规则,请修改其
enabled列并将表重新加载到插件中。要禁用规则1:
mysql>UPDATE query_rewrite.rewrite_rules SET enabled = 'NO' WHERE id = 1;mysql>CALL query_rewrite.flush_rewrite_rules();
这使您可以在不从表格中删除规则的情况下取消激活规则。
要重新启用规则1:
mysql>UPDATE query_rewrite.rewrite_rules SET enabled = 'YES' WHERE id = 1;mysql>CALL query_rewrite.flush_rewrite_rules();
该rewrite_rules表包含用于匹配不符合数据库名称的表名称的
pattern_database列
Rewriter:
如果相应的数据库和表名称相同,则语句中的合格表名与模式中的限定名匹配。
只有当默认数据库pattern_database与表名相同并且表名相同时,语句中的非限定表名才与模式中的非限定名匹配。
假设名为表appdb.users的列具有一个名为的列id,并且应用程序需要使用这些表单之一的查询来从表中选择行,其中第二个表只能用于
appdb默认数据库:
SELECT * FROM users WHERE appdb.id =id_value; SELECT * FROM users WHERE id =id_value;
假设id列被重命名为
user_id(也许该表必须被修改为添加另一种类型的ID,并且需要更具体地指示该id列代表什么类型的ID )。
变更意味着应用程序必须引用
user_id而不是id在WHERE条款中。但是,如果有旧的应用程序无法写入来更改SELECT它们生成的
查询,它们将不再正常工作。该Rewriter插件可以解决这个问题。要匹配和重写语句,无论它们是否符合表名,请添加以下两条规则并重新加载规则表:
mysql>INSERT INTO query_rewrite.rewrite_rules- >(pattern, replacement) VALUES(- >'SELECT * FROM appdb.users WHERE id = ?',- >'SELECT * FROM appdb.users WHERE user_id = ?'- >);mysql>INSERT INTO query_rewrite.rewrite_rules- >(pattern, replacement, pattern_database) VALUES(- >'SELECT * FROM users WHERE id = ?',- >'SELECT * FROM users WHERE user_id = ?',- >'appdb'- >);mysql>CALL query_rewrite.flush_rewrite_rules();
Rewriter使用第一条规则来匹配使用限定表名的语句。它使用第二个匹配使用非限定名称的语句,但只有在默认数据库是appdb(in中的值
pattern_database)的情况下。
该Rewriter插件使用语句摘要和摘要散列值来分阶段地将传入语句与重写规则进行匹配。的
max_digest_length系统变量决定用于计算语句摘要缓冲区的大小。较大的值可用于计算区分较长陈述的摘要。较小的值使用较少的内存,但增加了较长的语句与相同摘要值碰撞的可能性。
该插件将每条语句与重写规则进行匹配,如下所示:
计算语句摘要哈希值并将其与规则摘要哈希值进行比较。这受到误报,但可作为快速拒绝测试。
如果语句摘要哈希值与任何模式摘要哈希值匹配,则将语句的规范化(语句摘要)形式与匹配规则模式的规范化形式进行匹配。
如果规范化语句与规则匹配,则比较语句和模式中的文字值。?模式中的A
与语句中的任何文字值相匹配。如果陈述准备了
SELECT陈述,
则陈述中的陈述?也与?陈述相符
。否则,相应的文字必须相同。
如果多个规则匹配一个语句,插件用来重写语句的方式是不确定的。
如果一个模式包含比替换更多的标记,则该插件会丢弃多余的数据值。如果图案包含的标记数量少于替换的标记数量,则这是一个错误。插件会在加载规则表时注意到这一点,将错误消息写入message规则行的列以传达问题,并将
Rewriter_reload_error状态变量设置为ON。
准备好的语句在解析时(即准备时)被重写,而不是稍后执行。
已准备的语句与非准备语句的不同之处在于它们可能包含?字符作为参数标记。要匹配?准备好的语句中的Rewriter模式,模式必须包含
?在相同的位置。假设重写规则有这种模式:
SELECT?,3
下表显示了几个准备好的
SELECT语句以及规则模式是否匹配它们。
| 编制声明 | 模式是否符合声明 |
|---|---|
PREPARE s AS 'SELECT 3, 3' |
是 |
PREPARE s AS 'SELECT ?, 3' |
是 |
PREPARE s AS 'SELECT 3, ?' |
没有 |
PREPARE s AS 'SELECT ?, ?' |
没有 |
该Rewriter插件通过几个状态变量提供有关其操作的信息:
MySQL的> SHOW GLOBAL STATUS LIKE 'Rewriter%';
+ ----------------------------------- + ------- +
| 变量名| 值|
+ ----------------------------------- + ------- +
| Rewriter_number_loaded_rules | 1 |
| 重写器_编号_重载| 5 |
| Rewriter_number_rewritten_queries | 1 |
| Rewriter_reload_error | ON |
+ ----------------------------------- + ------- +
有关这些变量的说明,请参见 第5.5.4.3.4节“重写器查询重写插件状态变量”。
当通过调用flush_rewrite_rules()存储过程加载规则表时
,如果某个规则发生错误,该CALL
语句会产生一个错误,插件会将
Rewriter_reload_error状态变量设置为
ON:
MySQL的>CALL query_rewrite.flush_rewrite_rules();错误1644(45000):某些规则的加载失败。 MySQL的>SHOW GLOBAL STATUS LIKE 'Rewriter_reload_error';+ ----------------------- + ------- + | 变量名| 值| + ----------------------- + ------- + | Rewriter_reload_error | ON | + ----------------------- + ------- +
在这种情况下,检查message的列
rewrite_rules的非表行NULL值,看看有什么问题了。
当rewrite_rules表格被加载到Rewriter插件中时,插件使用character_set_client系统变量的当前全局值来解释语句
。如果全局
character_set_client值随后发生更改,则必须重新加载规则表。
客户端必须具有character_set_client与加载规则表时的全局值相同的会话
值,否则规则匹配将不适用于该客户端。
以下讨论可作为与Rewriter查询重写插件相关的这些组件的参考:
数据库中
的Rewriter规则表
query_rewrite
Rewriter 程序和功能
Rewriter 系统和状态变量
数据库中
的rewrite_rules表
query_rewrite为Rewriter
插件用来决定是否重写语句的规则提供持久存储。
用户通过修改该表中存储的规则集与插件进行通信。该插件通过设置表格的message列与用户进行通信。
规则表由flush_rewrite_rules存储过程加载到插件中
。除非在最近的表格修改之后调用该过程,否则表格内容不一定对应于插件使用的规则集合。
该rewrite_rules表具有以下列:
id
规则ID。该列是表主键。您可以使用该ID来唯一标识任何规则。
pattern
指示规则匹配的语句模式的模板。使用?表示匹配的数据值是参数标记。
pattern_database
用于匹配语句中不合格表名的数据库。如果相应的数据库和表名称相同,则语句中的合格表名与模式中的限定名匹配。只有当默认数据库pattern_database与表名相同并且表名相同时,语句中的非限定表名才与模式中的非限定名匹配
。
replacement
指示如何重写与pattern列值匹配的语句的模板。使用
?表示匹配的数据值是参数标记。在重写的语句中,插件使用与之相对应的标记匹配的数据值
替换?参数标记
。
replacementpattern
enabled
规则是否启用。加载操作(通过调用flush_rewrite_rules()
存储过程执行)Rewriter仅当该列YES(Y
在MySQL 5.7.8之前)时才将表中的规则加载到
内存中缓存中。
此列可以在不删除规则的情况下停用规则:将列设置为除以外的值
YES并将表重新加载到插件中。
message
该插件使用此列与用户进行通信。如果规则表加载到内存中时没有发生错误,插件会将该message
列设置为NULL。非NULL值表示错误,列内容是错误消息。在这些情况下可能会发生错误:
模式或替换是一个不正确的SQL语句,它会产生语法错误。
替换包含?
比模式更多的参数标记。
如果发生加载错误,插件还会将
Rewriter_reload_error
状态变量设置为ON。
pattern_digest
该列用于调试和诊断。如果规则表加载到内存中时该列存在,插件会使用模式摘要更新它。如果您试图确定为什么某些语句无法重写,此列可能很有用。
normalized_pattern
该列用于调试和诊断。如果规则表加载到内存中时该列存在,则插件会使用规范化的模式更新它。如果您试图确定为什么某些语句无法重写,此列可能很有用。
在MySQL 5.7.8之前pattern_digest
,normalized_pattern列和列是可选的:如果您Rewriter使用该插件安装插件
install_rewriter_with_optional_columns.sql,则会创建它们
,但如果您使用则不会
install_rewriter.sql。
Rewriter插件操作使用将规则表加载到其内存中缓存的存储过程以及帮助程序用户定义的函数(UDF)。在正常操作下,用户只调用存储过程。UDF旨在由存储过程调用,而不是由用户直接调用。
flush_rewrite_rules()
此存储过程使用
load_rewrite_rules()UDF将rewrite_rules表的内容加载到Rewriter内存中的缓存中。加载表后,它也会清除查询缓存。
调用flush_rewrite_rules()意味着
COMMIT。
修改规则表以使插件从新表内容更新其缓存后,调用此过程。如果发生任何错误,插件会message为表中适当的规则行设置
列,并将
Rewriter_reload_error
状态变量设置为ON。
load_rewrite_rules()
这个UDF是flush_rewrite_rules()存储过程使用的帮助
程序。
该Rewriter查询重写插件支持以下系统变量。这些变量仅在插件已安装时才可用(请参见
第5.5.4.1节“安装或卸载重写器查询重写插件”)。
| 属性 | 值 |
|---|---|
| 介绍 | 5.7.6 |
| 系统变量 | rewriter_enabled |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 布尔 |
| 默认 | ON |
是否Rewriter启用查询重写插件。
| 属性 | 值 |
|---|---|
| 介绍 | 5.7.6 |
| 系统变量 | rewriter_verbose |
| 范围 | 全球 |
| 动态 | 是 |
| 类型 | 整数 |
供内部使用。
该Rewriter查询重写插件支持以下状态变量。这些变量仅在插件已安装时才可用(请参见
第5.5.4.1节“安装或卸载重写器查询重写插件”)。
重写插件重写规则的数量已成功从rewrite_rules表中加载到内存中供Rewriter
插件使用。
的次数的rewrite_rules
表已经被加载到由所使用的内存中缓存
Rewriter插件。
Rewriter_number_rewritten_queries
Rewriter查询重写插件在加载后
重写的查询数量
。
最近一次将rewrite_rules表加载到Rewriter
插件使用的内存中缓存中是否发生错误
。如果该值是OFF,则不会发生错误。如果该值是ON,则发生错误; 检查表中的message列以rewriter_rules获取错误消息。
MySQL 5.7.8或更高版本的分发包括版本令牌,该功能支持创建服务器令牌并对其进行同步,以便应用程序可以使用这些令牌来防止访问不正确或过时的数据。
版本令牌接口具有以下特征:
版本令牌是由作为密钥或标识符的名称和值组成的对。
版本令牌可以被锁定。应用程序可以使用令牌锁来向其他合作应用程序指示令牌正在使用中且不应该被修改。
版本令牌列表是每个服务器建立的; 例如,指定服务器分配或操作状态。另外,与服务器通信的应用程序可以注册其自己的令牌列表,以指示它需要服务器所处的状态。应用程序发送给未处于所需状态的服务器的SQL语句会产生错误。这是应用程序的一个信号,它应该在所需状态下寻找一个不同的服务器来接收SQL语句。
以下各节介绍版本令牌的组件,讨论如何安装和使用它,并为其组件提供参考信息。
版本令牌基于实现这些组件的插件库:
一个名为服务器端的插件version_tokens
包含与服务器关联的版本令牌列表,并为语句执行事件订阅通知。该version_tokens插件使用审计插件API监视来自客户端的传入语句,并将每个客户端的会话特定版本令牌列表与服务器版本令牌列表进行匹配。如果匹配,插件让声明通过,服务器继续处理它。否则,插件会向客户端返回错误,并且语句失败。
一组用户定义的函数(UDF)提供了一个SQL级别的API,用于操纵和检查由插件维护的服务器版本令牌列表。该
SUPER特权需要调用任何版本令牌UDF。
系统变量使客户端能够指定注册所需服务器状态的版本令牌列表。如果服务器在客户端发送语句时具有不同的状态,则客户端会收到错误。
如果安装,版本令牌会涉及一些开销。为了避免这种开销,除非你打算使用它,否则不要安装它。
本节介绍如何安装或卸载版本令牌,该版本在包含插件和用户定义函数的插件库文件中实现。有关安装或卸载插件和UDF的一般信息,请参见 第5.5.1节“安装和卸载插件”以及 第28.4.2.5节“UDF编译和安装”。
为了供服务器使用,插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。如有必要,请设置plugin_dir服务器启动时的值
以告知服务器插件目录位置。
插件库文件的基本名称是
version_tokens。每个平台的文件名后缀都不相同(例如,.so对于Unix和类Unix系统,.dll对于Windows)。
要安装版本令牌插件和UDF,请使用
INSTALL PLUGIN和
CREATE FUNCTION语句(.so根据需要调整您的平台的后缀):
INSTALL PLUGIN version_tokens SONAME'version_token.so'; CREATE FUNCTION version_tokens_set RETURNS STRING SONAME'version_token.so'; CREATE FUNCTION version_tokens_show RETURNS STRING SONAME'version_token.so'; CREATE FUNCTION version_tokens_edit RETURNS STRING SONAME'version_token.so'; CREATE FUNCTION version_tokens_delete RETURNS STRING SONAME'version_token.so'; CREATE FUNCTION version_tokens_lock_shared RETURNS INT SONAME'version_token.so'; CREATE FUNCTION version_tokens_lock_exclusive RETURNS INT SONAME'version_token.so'; CREATE FUNCTION version_tokens_unlock RETURNS INT SONAME'version_token.so';
您必须安装UDF来管理服务器的版本令牌列表,但是您还必须安装该插件,因为没有它,UDF将无法正常工作。
如果插件和UDF在主复制服务器上使用,请将它们安装在所有从属服务器上以避免复制问题。
按照刚刚描述的方式安装后,版本令牌插件和UDF将保持安装状态直到卸载。要删除它们,请使用
UNINSTALL PLUGIN和
DROP FUNCTION声明:
UNINSTALL PLUGIN version_tokens; DROP FUNCTION version_tokens_set; DROP FUNCTION version_tokens_show; DROP FUNCTION version_tokens_edit; DROP FUNCTION version_tokens_delete; DROP FUNCTION version_tokens_lock_shared; DROP FUNCTION version_tokens_lock_exclusive; DROP FUNCTION version_tokens_unlock;
使用版本令牌之前,请按照第5.5.5.2节“安装或卸载版本令牌”中提供的说明进行 安装。
Version Tokens可以使用的一个场景是访问MySQL服务器集合的系统,但需要通过监视它们并根据负载变化调整服务器分配来管理它们以实现负载平衡。这样的系统包括这些组件:
要管理的MySQL服务器的集合。
与服务器通信并将其组织成高可用性组的管理或管理应用程序。组有不同的用途,每个组内的服务器可能有不同的分配。某个组内的服务器分配可随时更改。
访问服务器以检索和更新数据的客户端应用程序,根据分配的目的选择服务器。例如,客户端不应该将更新发送到只读服务器。
版本令牌允许服务器访问根据分配进行管理,而无需客户端重复查询服务器的分配情况:
管理应用程序执行服务器分配并在每台服务器上建立版本令牌以反映其分配情况。应用程序缓存这些信息以提供一个中央访问点。
如果某些时候管理应用程序需要更改服务器分配(例如,将其从允许写入更改为只读),则它会更改服务器的版本令牌列表并更新其缓存。
为了提高性能,客户端应用程序从管理应用程序获取缓存信息,从而避免必须检索每个语句的服务器分配信息。根据它将发布的语句类型(例如读取与写入),客户端会选择一个适当的服务器并连接到它。
另外,客户端向服务器发送它自己的特定于客户端的版本令牌以注册它对服务器所要求的分配。对于客户端向服务器发送的每条语句,服务器会将其自己的令牌列表与客户端令牌列表进行比较。如果服务器令牌列表包含具有相同值的客户端令牌列表中存在的所有令牌,则匹配并且服务器执行该语句。
另一方面,管理应用程序可能已更改了服务器分配及其版本令牌列表。在这种情况下,新的服务器分配现在可能与客户端要求不兼容。服务器和客户端令牌列表之间发生令牌不匹配,并且服务器返回错误来回复该语句。这是客户端从管理应用程序缓存中刷新版本令牌信息并选择要与之通信的新服务器的指示。
用于检测版本令牌错误和选择新服务器的客户端逻辑可以以不同的方式实现:
客户端可以处理所有的版本令牌注册,不匹配检测以及自身的连接切换。
这些操作的逻辑可以在管理客户端和MySQL服务器之间连接的连接器中实现。这样的连接器可能会处理不匹配错误检测和重新发送自己的语句,或者它可能会将错误传递给应用程序,并将其留给应用程序重新发送该语句。
以下示例以更具体的形式说明了前面的讨论。
当版本令牌在给定服务器上初始化时,服务器的版本令牌列表为空。令牌列表维护通过调用用户定义函数(UDF)来执行。该
SUPER权限才能调用任何版本令牌的UDF,所以令牌列表修改预期由具有相应权限的管理或行政程序来完成。
假设管理应用程序与客户端查询的一组服务器通信以访问员工和产品数据库(分别命名emp和
prod分别)。所有服务器都可以处理数据检索语句,但只有其中一些服务器可以进行数据库更新。为了在数据库特定的基础上处理这个问题,管理应用程序在每台服务器上建立一个版本令牌列表。在给定的服务器令牌列表,令牌名表示数据库名称和标记值read或write
依赖于数据库是否必须以只读方式使用,或者是否可以读取和写入。
客户端应用程序通过设置系统变量来注册它们要求服务器匹配的版本令牌列表。变量设置发生在客户特定的基础上,因此不同的客户可以注册不同的需求。默认情况下,客户端令牌列表为空,与任何服务器令牌列表匹配。当客户端将其令牌列表设置为非空值时,匹配可能成功或失败,具体取决于服务器版本令牌列表。
要为服务器定义版本标记列表,管理应用程序将调用version_token_set()
UDF。(还有用于修改和显示令牌列表的UDF,稍后介绍)。例如,应用程序可能会将这些语句发送给一组三个服务器:
服务器1:
MySQL的> SELECT version_tokens_set('emp=read;prod=read');
+ ------------------------------------------ +
| version_tokens_set('emp = read; prod = read')|
+ ------------------------------------------ +
| 2版本令牌设置。|
+ ------------------------------------------ +
服务器2:
MySQL的> SELECT version_tokens_set('emp=write;prod=read');
+ ------------------------------------------- +
| version_tokens_set('emp = write; prod = read')|
+ ------------------------------------------- +
| 2版本令牌设置。|
+ ------------------------------------------- +
服务器3:
MySQL的> SELECT version_tokens_set('emp=read;prod=write');
+ ------------------------------------------- +
| version_tokens_set('emp = read; prod = write')|
+ ------------------------------------------- +
| 2版本令牌设置。|
+ ------------------------------------------- +
每种情况下的令牌列表都被指定为以分号分隔的
对列表
。得到的令牌列表值导致这些服务器分配:
name=value
任何服务器都接受读取任一数据库。
只有服务器2接受emp
数据库的更新。
只有服务器3接受prod数据库的更新
。
除了为每个服务器分配一个版本令牌列表之外,管理应用程序还维护一个反映服务器分配的缓存。
在与服务器通信之前,客户端应用程序会联系管理应用程序并检索有关服务器分配的信息。然后客户端根据这些分配选择一台服务器。假设一个客户想要在emp数据库上执行读写操作。根据前面的分配,只有服务器2符合要求。客户端连接到服务器2并通过设置其version_tokens_session系统变量在那里注册其服务器要求
:
MySQL的> SET @@session.version_tokens_session = 'emp=write';
对于客户端向服务器2发送的后续语句,服务器会将其自己的版本令牌列表与客户端列表进行比较,以检查它们是否匹配。如果是这样,语句正常执行:
MySQL的>UPDATE emp.employee SET salary = salary * 1.1 WHERE id = 4981;查询OK,1行受影响(0.07秒) 匹配行数:1更改:1警告:0 MySQL的>SELECT last_name, first_name FROM emp.employee WHERE id = 4981;+ ----------- ------------ + + | last_name | first_name | + ----------- ------------ + + | 史密斯| Abe | + ----------- ------------ + + 一排(0.01秒)
服务器和客户端版本令牌列表之间的差异可以通过两种方式发生:
该version_tokens_session
值中的令牌名称
不存在于服务器令牌列表中。在这种情况下,
ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND
会发生错误。
值中的令牌值version_tokens_session
与服务器令牌列表中相应令牌的
值不同。在这种情况下,
ER_VTOKEN_PLUGIN_TOKEN_MISMATCH
会发生错误。
只要服务器2的分配不变,客户端就会继续使用它进行读取和写入。但是,假设管理应用程序想要更改服务器分配,以便emp
数据库的写入必须发送到服务器1而不是服务器2.为此,它使用version_tokens_edit()修改emp两台服务器上的标记值(并更新其服务器缓存分配):
服务器1:
MySQL的> SELECT version_tokens_edit('emp=write');
+ ---------------------------------- +
| version_tokens_edit('emp = write')|
+ ---------------------------------- +
| 1版本令牌更新。|
+ ---------------------------------- +
服务器2:
MySQL的> SELECT version_tokens_edit('emp=read');
+ --------------------------------- +
| version_tokens_edit('emp = read')|
+ --------------------------------- +
| 1版本令牌更新。|
+ --------------------------------- +
version_tokens_edit() 修改服务器令牌列表中的指定令牌,并保持其他令牌不变。
客户端下次向服务器2发送语句时,它自己的令牌列表不再与服务器令牌列表匹配并发生错误:
MySQL的> UPDATE emp.employee SET salary = salary * 1.1 WHERE id = 4982;
错误3136(42000):版本令牌不匹配emp。正确读取值
在这种情况下,客户端应联系管理应用程序以获取有关服务器分配的更新信息,选择新服务器并将失败的语句发送到新服务器。
每个客户端必须通过根据向特定服务器注册的令牌列表仅发送语句来配合版本令牌。例如,如果客户端注册了令牌列表'emp=read',则版本令牌中不会有任何内容阻止客户端发送emp数据库更新。客户本身必须避免这样做。
对于从客户端接收到的每个语句,服务器隐式使用锁定,如下所示:
对客户端令牌列表中指定的每个令牌采取共享锁(即在该
version_tokens_session
值中)
执行服务器和客户端令牌列表之间的比较
根据比较结果执行语句或产生错误
释放锁
服务器使用共享锁,以便可以在不阻塞的情况下进行多个会话的比较,同时防止任何尝试获取排它锁的会话的令牌更改,然后它会处理服务器令牌列表中相同名称的令牌。
前面的示例仅使用版本令牌插件库中包含的几个用户定义,但还有其他一些。一组UDF允许对服务器的版本令牌列表进行操作和检查。另一组UDF允许版本令牌被锁定和解锁。
这些UDF允许创建,更改,删除和检查服务器的版本令牌列表:
version_tokens_set()完全取代当前列表并分配新列表。参数是一
对以分号分隔的列表
。
name=value
version_tokens_edit()能够对当前列表进行部分修改。它可以添加新的令牌或更改现有令牌的值。参数是一
对以分号分隔的列表
。
name=value
version_tokens_delete()从当前列表中删除令牌。该参数是以分号分隔的标记名称列表。
version_tokens_show()显示当前令牌列表。它没有任何争论。
如果成功,每个函数都会返回一个二进制字符串,指示发生了什么操作。以下示例建立服务器令牌列表,通过添加新令牌来修改它,删除一些令牌并显示结果令牌列表:
MySQL的>SELECT version_tokens_set('tok1=a;tok2=b');+ ------------------------------- + | version_tokens_set('tok1 = a; tok2 = b')| + ------------------------------- + | 2版本令牌设置。| + ------------------------------- + MySQL的>SELECT version_tokens_edit('tok3=c');+ ------------------------------- + | version_tokens_edit('tok3 = c')| + ------------------------------- + | 1版本令牌更新。| + ------------------------------- + MySQL的>SELECT version_tokens_delete('tok2;tok1');+ ------------------------------------ + | version_tokens_delete('tok2; tok1')| + ------------------------------------ + | 2版本令牌被删除。| + ------------------------------------ + MySQL的>SELECT version_tokens_show();+ ----------------------- + | version_tokens_show()| + ----------------------- + | tok3 = C; | + ----------------------- +
如果令牌列表格式错误,则会发生警告:
MySQL的>SELECT version_tokens_set('tok1=a; =c');+ ---------------------------------- + | version_tokens_set('tok1 = a; = c')| + ---------------------------------- + | 1版本令牌设置。| + ---------------------------------- + 1行,1警告(0.00秒) MySQL的>SHOW WARNINGS\G*************************** 1. row ******************** ******* 级别:警告 代码:42000 消息:遇到无效的版本令牌对。提供的列表 只是部分更新。 一排(0.00秒)
如前所述,版本令牌是使用以分号分隔的
对列表来定义的
。考虑这个调用
:
name=valueversion_tokens_set()
MySQL的> SELECT version_tokens_set('tok1=b;;; tok2= a = b ; tok1 = 1\'2 3"4')
+ ------------------------------------------------- -------------- +
| version_tokens_set('tok1 = b ;;; tok2 = a = b; tok1 = 1 \'2 3“4')|
+ ------------------------------------------------- -------------- +
| 3版本令牌设置。|
+ ------------------------------------------------- -------------- +
版本令牌解释参数如下:
名称和值周围的空白被忽略。名称和值中的空格是允许的。(对于
version_tokens_delete()需要名称不含值的列表,名称周围的空白将被忽略。)
没有引用机制。
令牌顺序并不重要,只是如果令牌列表包含给定令牌名称的多个实例,则最后的值优先于先前的值。
根据这些规则,前面的
version_tokens_set()调用会生成带有两个令牌的令牌列表:tok1具有值
1'2 3"4并tok2具有值a = b。要验证这一点,请致电
version_tokens_show():
MySQL的> SELECT version_tokens_show();
+ -------------------------- +
| version_tokens_show()|
+ -------------------------- +
| tok2 = a = b; tok1 = 1'2 3“4; |
+ -------------------------- +
如果令牌列表包含两个令牌,为什么
version_tokens_set()返回值
3 version tokens set?发生这种情况是因为原始标记列表包含两个定义
tok1,第二个定义替换了第一个。
版本令牌令牌操作UDF将这些约束放置在令牌名称和值上:
令牌名称不能包含=或
;字符,最大长度为64个字符。
令牌值不能包含;字符。值的长度受max_allowed_packet系统变量的值限制
。
版本令牌将令牌名称和值视为二进制字符串,因此比较区分大小写。
版本令牌还包括一组使用令牌锁定和解锁的UDF:
version_tokens_lock_exclusive()获取独占版本令牌锁。它采用一个或多个锁名称和一个超时值的列表。
version_tokens_lock_shared()获取共享的版本令牌锁。它采用一个或多个锁名称和一个超时值的列表。
version_tokens_unlock()发布版本令牌锁(独占和共享)。它没有任何争论。
每个锁定函数返回非零值以获得成功。否则,会发生错误:
MySQL的>SELECT version_tokens_lock_shared('lock1', 'lock2', 0);+ ------------------------------------------------- + | version_tokens_lock_shared('lock1','lock2',0)| + ------------------------------------------------- + | 1 | + ------------------------------------------------- + MySQL的>SELECT version_tokens_lock_shared(NULL, 0);错误3131(42000):锁定服务锁定名称'(空)'不正确。
使用版本令牌锁定功能进行锁定是建议性的; 应用程序必须同意合作。
可以锁定不存在的令牌名称。这不会创建令牌。
版本令牌锁定功能基于第28.3.1节“锁定服务”中描述的锁定服务,因此对于共享锁和排他锁具有相同的语义。(版本令牌使用内置于服务器中的锁定服务例程,而不是锁定服务UDF接口,因此无需安装这些UDF即可使用版本令牌。)版本令牌获取的锁使用锁定服务名称空间
version_token_locks。锁定服务锁可以使用性能模式进行监控,因此版本令牌锁也是如此。有关详细信息,请参见
第28.3.1.2.3节“锁定服务监控”。
对于版本令牌锁定功能,令牌名称参数完全按照指定使用。周围的空白不被忽略,=并且;
允许字符。这是因为版本令牌只是将令牌名称传递给锁定服务。
以下讨论可用作对这些版本令牌组件的引用:
版本令牌插件库包含多个用户定义的函数。一组UDF允许对服务器的版本令牌列表进行操作和检查。另一组UDF允许版本令牌被锁定和解锁。该SUPER特权是调用任何版本令牌UDF所必需的。
以下UDF允许创建,更改,删除和检查服务器的版本令牌列表。如第5.5.5.3节“使用版本令牌”中所述,解释name_list和
token_list参数(包括空白处理)发生
,其中提供了有关用于指定令牌的语法的详细信息以及其他示例。
version_tokens_delete(
name_list)
使用name_list参数从服务器的版本令牌列表中删除令牌,并返回指示操作结果的二进制字符串。name_list是要删除的版本标记名称的分号分隔列表。
MySQL的> SELECT version_tokens_delete('tok1;tok3');
+ ------------------------------------ +
| version_tokens_delete('tok1; tok3')|
+ ------------------------------------ +
| 2版本令牌被删除。|
+ ------------------------------------ +
从MySQL 5.7.9开始,一个参数NULL
被视为一个空字符串,它对令牌列表没有影响。
version_tokens_delete()删除其参数中命名的令牌(如果存在)。(删除不存在的令牌并不是错误。)要清除令牌列表而不知道列表中有哪些令牌,请将NULL不含令牌的字符串传递给version_tokens_set():
MySQL的>SELECT version_tokens_set(NULL);+ ------------------------------ + | version_tokens_set(NULL)| + ------------------------------ + | 版本令牌列表已清除。| + ------------------------------ + MySQL的>SELECT version_tokens_set('');+ ------------------------------ + | version_tokens_set('')| + ------------------------------ + | 版本令牌列表已清除。| + ------------------------------ +
version_tokens_edit(
token_list)
使用token_list参数修改服务器的版本令牌列表,
并返回指示操作结果的二进制字符串。token_list是以分号分隔的列表
对,指定要定义的每个标记的名称及其值。如果存在令牌,则使用给定值更新其值。如果令牌不存在,则使用给定的值创建该令牌。如果参数是
或不包含令牌的字符串,则令牌列表保持不变。
name=valueNULL
MySQL的>SELECT version_tokens_set('tok1=value1;tok2=value2');+ ----------------------------------------------- + | version_tokens_set('tok1 = value1; tok2 = value2')| + ----------------------------------------------- + | 2版本令牌设置。| + ----------------------------------------------- + MySQL的>SELECT version_tokens_edit('tok2=new_value2;tok3=new_value3');+ ------------------------------------------------- ------- + | version_tokens_edit('tok2 = new_value2; tok3 = new_value3')| + ------------------------------------------------- ------- + | 2版本令牌更新。| + ------------------------------------------------- ------- +
version_tokens_set(
token_list)
使用token_list参数中定义的标记替换服务器的版本标记列表,
并返回一个表示操作结果的二进制字符串。token_list是以分号分隔的列表
对,指定要定义的每个标记的名称及其值。如果参数是或不包含标记的字符串,标记列表将被清除。
name=valueNULL
MySQL的> SELECT version_tokens_set('tok1=value1;tok2=value2');
+ ----------------------------------------------- +
| version_tokens_set('tok1 = value1; tok2 = value2')|
+ ----------------------------------------------- +
| 2版本令牌设置。|
+ ----------------------------------------------- +
version_tokens_show()
将服务器版本令牌列表作为包含分号分隔列表
对的二进制字符串返回
。
name=value
MySQL的> SELECT version_tokens_show();
+ -------------------------- +
| version_tokens_show()|
+ -------------------------- +
| tok2 =值2; tok1 =值1; |
+ -------------------------- +
以下UDF允许版本令牌被锁定和解锁:
version_tokens_lock_exclusive(
token_name[,
token_name] ...,
timeout)
获取一个或多个版本令牌的独占锁定,由名称指定为字符串,如果在给定的超时值内没有获取到锁定,则超时并返回错误。
MySQL的> SELECT version_tokens_lock_exclusive('lock1', 'lock2', 10);
+ ------------------------------------------------- ---- +
| version_tokens_lock_exclusive('lock1','lock2',10)|
+ ------------------------------------------------- ---- +
| 1 |
+ ------------------------------------------------- ---- +
该函数在MySQL 5.7.8中添加了名称
,并重vtoken_get_write_locks()命名为
version_tokens_lock_exclusive()5.7.9。
version_tokens_lock_shared(
token_name[,
token_name] ...,
timeout)
获取一个或多个版本令牌的共享锁,由名称指定为字符串,如果在给定的超时值内没有获取到锁,则超时并返回错误。
MySQL的> SELECT version_tokens_lock_shared('lock1', 'lock2', 10);
+ ------------------------------------------------- - +
| version_tokens_lock_shared('lock1','lock2',10)|
+ ------------------------------------------------- - +
| 1 |
+ ------------------------------------------------- - +
该函数在MySQL 5.7.8中添加了名称
,并重vtoken_get_read_locks()命名为
version_tokens_lock_shared()5.7.9。
version_tokens_unlock()
使用version_tokens_lock_exclusive()和
释放在当前会话中获取的所有锁定
version_tokens_lock_shared()。
MySQL的> SELECT version_tokens_unlock();
+ ------------------------- +
| version_tokens_unlock()|
+ ------------------------- +
| 1 |
+ ------------------------- +
该函数在MySQL 5.7.8中添加了名称
,并重vtoken_release_locks()命名为
version_tokens_unlock()5.7.9。
锁定功能具有以下特点:
成功返回值不为零。否则,会发生错误。
令牌名称是字符串。
与操纵服务器令牌列表的UDF的参数处理相比,令牌名称参数周围的空白不会被忽略,
=并且;允许使用字符。
可以锁定不存在的令牌名称。这不会创建令牌。
超时值是非负整数,表示在发生错误超时之前等待获取锁定的时间(以秒为单位)。如果超时为0,则不会等待,并且如果不能立即获取锁,则函数会产生错误。
版本令牌锁定功能基于第28.3.1节“锁定服务”中介绍的锁定服务。
版本令牌支持以下系统变量。除非安装了版本令牌插件,否则这些变量不可用(请参见第5.5.5.2节“安装或卸载版本令牌”)。
系统变量:
| 属性 | 值 |
|---|---|
| 命令行格式 | --version-tokens-session=value |
| 介绍 | 5.7.8 |
| 系统变量 | version_tokens_session |
| 范围 | 全球,会议 |
| 动态 | 是 |
| 类型 | 串 |
| 默认 | NULL |
此变量的会话值指定客户端版本令牌列表,并指示客户端会话要求服务器版本令牌列表具有的令牌。
如果
version_tokens_session
变量是NULL(默认值)或具有空值,则任何服务器版本令牌列表都匹配。(实际上,一个空值会禁用匹配要求。)
如果
version_tokens_session
变量具有非空值,则其值与服务器版本令牌列表之间的任何不匹配都会导致会话发送到服务器的任何语句出错。在这些条件下发生不匹配:
该version_tokens_session
值中的令牌名称
不存在于服务器令牌列表中。在这种情况下,
ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND
会发生错误。
值中的令牌值version_tokens_session
与服务器令牌列表中相应令牌的
值不同。在这种情况下,
ER_VTOKEN_PLUGIN_TOKEN_MISMATCH
会发生错误。
服务器版本令牌列表不包含未在该version_tokens_session
值中命名的令牌不匹配
。
假设管理应用程序已经设置了服务器令牌列表,如下所示:
MySQL的> SELECT version_tokens_set('tok1=a;tok2=b;tok3=c');
+ -------------------------------------------- +
| version_tokens_set('tok1 = a; tok2 = b; tok3 = c')|
+ -------------------------------------------- +
| 3版本令牌设置。|
+ -------------------------------------------- +
客户端通过设置其version_tokens_session
值来注册它需要服务器匹配的令牌
。然后,对于客户端发送的每个后续语句,服务器都会根据客户端version_tokens_session
值检查其令牌列表,
并在出现不匹配时产生错误:
mysql>SET @@session.version_tokens_session = 'tok1=a;tok2=b';mysql>SELECT 1;+ --- + | 1 | + --- + | 1 | + --- + mysql>SET @@session.version_tokens_session = 'tok1=b';mysql>SELECT 1;错误3136(42000):版本令牌不匹配tok1。正确的价值a
第一SELECT成功,因为在客户端令牌tok1和
tok2存在于服务器令牌列表,并且每个令牌具有在服务器列表中的值相同。第二个SELECT失败的原因是,尽管tok1存在于服务器令牌列表中,但其值与客户端指定的值不同。
此时,除非服务器令牌列表发生更改以使其再次匹配,否则客户端发送的任何语句都会失败。假设管理应用程序如下更改服务器令牌列表:
MySQL的>SELECT version_tokens_edit('tok1=b');+ ------------------------------- + | version_tokens_edit('tok1 = b')| + ------------------------------- + | 1版本令牌更新。| + ------------------------------- + MySQL的>SELECT version_tokens_show();+ ----------------------- + | version_tokens_show()| + ----------------------- + | tok3 = C; tok1 = B; tok2 = B; | + ----------------------- +
现在客户端
version_tokens_session
值匹配服务器令牌列表,并且客户端可以再次成功执行语句:
MySQL的> SELECT 1;
+ --- +
| 1 |
+ --- +
| 1 |
+ --- +
这个变量是在MySQL 5.7.8中添加的。
| 属性 | 值 |
|---|---|
| 命令行格式 | --version-tokens-session-number=N |
| 介绍 | 5.7.8 |
| 系统变量 | version_tokens_session_number |
| 范围 | 全球,会议 |
| 动态 | 没有 |
| 类型 | 整数 |
| 默认 | 0 |
这个变量是供内部使用的。
这个变量是在MySQL 5.7.8中添加的。
在某些情况下,您可能希望在单台机器上运行多个MySQL实例。您可能想要测试新的MySQL版本,同时保持现有生产环境不受干扰。或者你可能想让不同的用户访问他们自己管理的不同 mysqld服务器。(例如,您可能是Internet服务提供商,希望为不同的客户提供独立的MySQL安装。)
每个实例可以使用不同的MySQL服务器二进制文件,也可以对多个实例使用相同的二进制文件,也可以使用这两种方法的任意组合。例如,您可以从MySQL 5.6运行服务器,从MySQL 5.7运行服务器,以查看不同版本如何处理给定的工作负载。或者您可以运行当前生产版本的多个实例,每个实例管理一组不同的数据库。
无论您是否使用不同的服务器二进制文件,您运行的每个实例都必须为多个操作参数配置唯一值。这消除了实例之间冲突的可能性。可以在命令行,选项文件或设置环境变量中设置参数。参见
第4.2.3节“指定程序选项”。要查看给定实例使用的值,请连接到它并执行SHOW
VARIABLES语句。
由MySQL实例管理的主要资源是数据目录。每个实例应使用不同的数据目录,其位置是使用该
选项指定的
。有关使用其自己的数据目录配置每个实例的方法,以及关于未能这样做的危险的警告,请参见
第5.6.1节“设置多个数据目录”。
--datadir=dir_name
除了使用不同的数据目录之外,其他几个选项对于每个服务器实例的值必须不同:
--port控制TCP / IP连接的端口号。或者,如果主机有多个网络地址,则可以使用
--bind-address每个服务器来侦听不同的地址。
--socket={
file_name|pipe_name}
--socket控制Unix上的Unix套接字文件路径或Windows上的命名管道名称。在Windows上,必须为配置为允许命名管道连接的服务器指定不同的管道名称。
--shared-memory-base-name=
name
该选项仅在Windows上使用。它指定Windows服务器使用的共享内存名称,以允许客户端使用共享内存进行连接。有必要为配置为允许共享内存连接的服务器指定不同的共享内存名称。
该选项指示服务器写入其进程ID的文件的路径名。
如果使用以下日志文件选项,则每个服务器的值必须不同:
有关日志文件选项的进一步讨论,请参见 第5.4节“MySQL服务器日志”。
为了获得更好的性能,您可以为每个服务器以不同的方式指定以下选项,以在多个物理磁盘之间分配负载:
拥有不同的临时目录也使得更容易确定哪个MySQL服务器创建了任何给定的临时文件。
如果您在不同位置安装了多个MySQL,则可以使用该
选项为每个安装指定基本目录
。这会导致每个实例自动使用不同的数据目录,日志文件和PID文件,因为每个参数的默认值都与基本目录相关。在这种情况下,您需要指定的唯一其他选项是
和
选项。假设您使用
文件二进制分发安装不同版本的MySQL 。它们安装在不同的位置,因此您可以使用相应基本目录下的命令bin / mysqld_safe为每个安装启动服务器
。mysqld_safe的--basedir=dir_name--socket--porttar确定--basedir传递给mysqld的正确
选项
,并且您只需指定
mysqld_safe的选项--socket和
--port选项
。
如以下部分所述,可以通过指定适当的命令选项或通过设置环境变量来启动其他服务器。但是,如果您需要更持久地运行多个服务器,则使用选项文件为每个服务器指定必须是唯一的选项值会更方便。该
--defaults-file选项对此很有用。
机器上的每个MySQL实例都应该有自己的数据目录。该位置是使用该
选项指定的
。
--datadir=dir_name
有一种为新实例设置数据目录的不同方法:
创建一个新的数据目录。
复制现有的数据目录。
以下讨论提供了关于每种方法的更多细节。
通常,你不应该有两台服务器在同一个数据库中更新数据。如果您的操作系统不支持无故障系统锁定,这可能会导致不愉快的意外。如果(尽管出现此警告)您使用相同的数据目录运行多个服务器并且启用了日志记录,则必须使用适当的选项来指定每个服务器独有的日志文件名。否则,服务器会尝试登录到相同的文件。
即使在遵守上述预防措施的情况下,这种设置也只适用于MyISAM和
MERGE表格,而不适用于任何其他存储引擎。此外,这种针对在服务器之间共享数据目录的警告始终适用于NFS环境。允许多个MySQL服务器通过NFS访问公共数据目录是一个非常糟糕的主意。主要问题是NFS是速度瓶颈。这并不意味着这种用途。NFS的另一个风险是您必须设法确保两台或更多台服务器不会互相干扰。通常NFS文件锁定是由
lockd 守护进程,但目前没有任何平台可以在任何情况下100%可靠地执行锁定。
使用这种方法,数据目录将处于与首次安装MySQL时相同的状态。它将具有默认的MySQL帐户集合并且没有用户数据。
在Unix上,初始化数据目录。请参见 第2.10节“安装后安装和测试”。
在Windows上,数据目录包含在MySQL发行版中:
适用于Windows的MySQL Zip存档分发包含未修改的数据目录。您可以将这样的分配解压到临时位置,然后将其复制
data到您设置新实例的位置。
Windows MSI软件包安装程序将创建并设置安装的服务器将使用的数据目录,但也会在安装目录下创建一个名为“ 模板 ”的原始数据
data目录。在使用MSI包执行安装后,可以复制模板数据目录以设置其他MySQL实例。
使用这种方法,数据目录中的任何MySQL帐户或用户数据都会转移到新的数据目录中。
使用数据目录停止现有的MySQL实例。这必须是干净的关闭,以便实例将任何挂起的更改刷新到磁盘。
将数据目录复制到新数据目录应该位于的位置。
复制现有实例使用的my.cnf或
my.ini选项文件。这是新实例的基础。
修改新的选项文件,以便引用原始数据目录的任何路径名引用新的数据目录。另外,修改每个实例必须唯一的其他选项,例如TCP / IP端口号和日志文件。有关每个实例必须唯一的参数列表,请参见 第5.6节“在一台计算机上运行多个MySQL实例”。
启动新实例,告诉它使用新的选项文件。
您可以在Windows上运行多个服务器,方法是从命令行手动启动它们,每个服务器都有适当的操作参数,或者将多个服务器安装为Windows服务并以这种方式运行它们。第2.3节“在Microsoft Windows上安装MySQL”中提供了有关从命令行运行MySQL或作为服务的一般说明 。以下各节介绍如何为每个服务器必须唯一的选项(如数据目录)启动具有不同值的每个服务器。这些选项在第5.6节“在一台机器上运行多个MySQL实例”中列出 。
第2.3.5.6节“从Windows命令行启动MySQL”中
介绍了从命令行手动启动单个MySQL服务器的过程
。要以这种方式启动多个服务器,可以在命令行或选项文件中指定适当的选项。将选项放在选项文件中更方便,但需要确保每个服务器都有自己的一组选项。为此,请为每个服务器创建一个选项文件,并--defaults-file
在运行时使用一个选项告诉服务器文件名。
假设你想在端口3307上运行一个mysqld实例,
其数据目录为
C:\mydata1,另一个实例在端口3308上,数据目录为C:\mydata2。使用此程序:
确保每个数据目录都存在,包括它自己的mysql包含授权表的数据库副本。
创建两个选项文件。例如,创建一个名为的文件
C:\my-opts1.cnf,如下所示:
的[mysqld] datadir = C:/ mydata1 端口= 3307
创建一个名为的第二个文件
C:\my-opts2.cnf,如下所示:
的[mysqld] datadir = C:/ mydata2 端口= 3308
使用该--defaults-file
选项可以使用自己的选项文件启动每个服务器:
C:\>C:\mysql\bin\mysqld --defaults-file=C:\my-opts1.cnfC:\>C:\mysql\bin\mysqld --defaults-file=C:\my-opts2.cnf
每台服务器都从前台启动(直到服务器稍后退出,才会显示新提示),因此您需要在单独的控制台窗口中发出这两个命令。
要关闭服务器,请使用适当的端口号连接到每个服务器:
C:\>C:\mysql\bin\mysqladmin --port=3307 --host=127.0.0.1 --user=root --password shutdownC:\>C:\mysql\bin\mysqladmin --port=3308 --host=127.0.0.1 --user=root --password shutdown
刚刚描述的服务器允许客户端通过TCP / IP进行连接。如果您的Windows版本支持命名管道,并且您还希望允许命名管道连接,请指定启用命名管道并指定其名称的选项。每个支持命名管道连接的服务器都必须使用唯一的管道名称。例如,该C:\my-opts1.cnf文件可能是这样写的:
的[mysqld] datadir = C:/ mydata1 端口= 3307 启用命名管道 socket = mypipe1
C:\my-opts2.cnf对第二台服务器的使用进行类似的
修改。然后按照前面所述启动服务器。
类似的过程适用于您想要允许共享内存连接的服务器。使用该--shared-memory选项启用此类连接,并使用该
选项为每台服务器指定唯一的共享内存名称
--shared-memory-base-name。
在Windows上,MySQL服务器可以作为Windows服务运行。第2.3.5.8节“将MySQL作为Windows服务启动”中介绍了安装,控制和删除单个MySQL服务的过程 。
要设置多个MySQL服务,您必须确保除了每个实例必须唯一的其他参数之外,每个实例都使用不同的服务名称。
对于以下说明,假设您要分别从安装在
和的两个不同版本的MySQL 运行
mysqld服务器。(如果您将5.5.9作为生产服务器运行,但也想使用5.7.23进行测试,则可能会出现这种情况。)
C:\mysql-5.5.9C:\mysql-5.7.23
要将Windows作为Windows服务安装,请使用
--install或--install-manual
选项。有关这些选项的信息,请参见
第2.3.5.8节“将MySQL作为Windows服务启动”。
根据上述信息,您可以通过多种方式设置多项服务。以下说明介绍了一些示例。在尝试其中任何一项之前,请关闭并删除任何现有的MySQL服务。
方法1:在其中一个标准选项文件中指定所有服务的选项。为此,请为每个服务器使用不同的服务名称。假设你要运行5.5.9
的mysqld使用的服务名称
mysqld1和23年7月5日
的mysqld使用的服务名称
mysqld2。在这种情况下,您可以将该
[mysqld1]组用于5.5.9,将该
[mysqld2]组用于5.7.23。例如,你可以C:\my.cnf
像这样设置:
#mysqld1服务的选项 [mysqld1] basedir = C:/mysql-5.5.9 端口= 3307 启用命名管道 socket = mypipe1 #mysqld2服务的选项 [mysqld2] basedir = C:/mysql-5.7.23 端口= 3308 启用命名管道 socket = mypipe2
使用完整的服务器路径名称按如下方式安装服务,以确保Windows为每项服务注册正确的可执行程序:
C:\>C:\mysql-5.5.9\bin\mysqld --install mysqld1C:\>C:\mysql-5.7.23\bin\mysqld --install mysqld2
要启动这些服务,请使用服务管理器,或使用 NET START和相应的服务名称:
C:\>NET START mysqld1C:\>NET START mysqld2
要停止服务,请使用服务管理器,或者使用 NET STOP和相应的服务名称:
C:\>NET STOP mysqld1C:\>NET STOP mysqld2
方法2:在单独的文件中为每个服务器指定选项,并--defaults-file在安装服务时使用
,以告知每个服务器使用哪个文件。在这种情况下,每个文件应该使用一个[mysqld]组列出选项
。
使用这种方法,要为5.5.9 mysqld指定选项
,请创建一个如下所示的文件
C:\my-opts1.cnf:
的[mysqld] basedir = C:/mysql-5.5.9 端口= 3307 启用命名管道 socket = mypipe1
对于5.7.23 mysqld,创建一个如下所示的文件C:\my-opts2.cnf:
的[mysqld] basedir = C:/mysql-5.7.23 端口= 3308 启用命名管道 socket = mypipe2
按照以下步骤安装服务(在一行中输入每条命令):
C:\> C:\>C:\mysql-5.5.9\bin\mysqld --install mysqld1--defaults-file=C:\my-opts1.cnfC:\mysql-5.7.23\bin\mysqld --install mysqld2--defaults-file=C:\my-opts2.cnf
当您将MySQL服务器安装为服务并使用
--defaults-file选项时,服务名称必须位于该选项之前。
安装服务之后,按照上例中的相同方式启动和停止它们。
要删除多个服务,请为每个服务使用mysqld --remove,并在该--remove选项后面指定服务名称。如果服务名称是默认(MySQL),则可以省略它。
这里的讨论使用mysqld_safe来启动MySQL的多个实例。对于使用RPM分发的MySQL安装,服务器启动和关闭由多个Linux平台上的systemd进行管理。在这些平台上, mysqld_safe未安装,因为它不是必需的。有关使用systemd处理多个MySQL实例的信息,请参见第2.5.10节“使用systemd管理MySQL服务器”。
一种方法是在Unix上运行多个MySQL实例,以编译具有不同默认TCP / IP端口和Unix套接字文件的不同服务器,以便每个服务器在不同的网络接口上侦听。为每个安装编译在不同的基本目录中也会自动生成单独的编译数据目录,日志文件和每个服务器的PID文件位置。
假定现有的5.6服务器配置为默认的TCP / IP端口号(3306)和Unix套接字文件(/tmp/mysql.sock)。要将新的5.7.23服务器配置为具有不同的操作参数,请使用如下所示的CMake命令:
外壳>cmake . -DMYSQL_TCP_PORT=port_number\-DMYSQL_UNIX_ADDR=file_name\-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.23
在这里,port_number并且
file_name必须与默认的TCP / IP端口号和Unix套接字文件路径名不同,并且该
CMAKE_INSTALL_PREFIX值应指定与现有MySQL安装所在的目录不同的安装目录。
如果你有一个MySQL服务器监听给定的端口号,你可以使用下面的命令找出它用于几个重要的可配置变量的操作参数,包括基本目录和Unix套接字文件名:
外壳> mysqladmin --host=host_name --port=port_number variables
通过该命令显示的信息,您可以知道配置其他服务器时不应使用哪些选项值。
如果您指定localhost为主机名,则
mysqladmin默认使用Unix套接字文件连接而不是TCP / IP。要明确指定连接协议,请使用该
--protocol={TCP|SOCKET|PIPE|MEMORY}
选项。
你不需要编译一个新的MySQL服务器,只需要启动一个不同的Unix套接字文件和TCP / IP端口号即可。也可以使用相同的服务器二进制文件,并在运行时使用不同的参数值启动它的每次调用。一种方法是使用命令行选项:
外壳> mysqld_safe --socket=file_name --port=port_number
要启动的第二服务器,提供不同的
--socket和
--port选项值,并传递一个
选项来mysqld_safe的,以便服务器使用不同的数据的目录。
--datadir=dir_name
或者,将每个服务器的选项放入不同的选项文件,然后使用--defaults-file指定相应选项文件路径的选项启动每个服务器
。例如,如果两个服务器实例的选项文件是命名的,
/usr/local/mysql/my.cnf并且
/usr/local/mysql/my.cnf2像这样启动服务器:command:
shell>mysqld_safe --defaults-file=/usr/local/mysql/my.cnfshell>mysqld_safe --defaults-file=/usr/local/mysql/my.cnf2
实现类似效果的另一种方法是使用环境变量来设置Unix套接字文件名和TCP / IP端口号:
shell>MYSQL_UNIX_PORT=/tmp/mysqld-new.sockshell>MYSQL_TCP_PORT=3307shell>export MYSQL_UNIX_PORT MYSQL_TCP_PORTshell>mysql_install_db --user=mysqlshell>mysqld_safe --datadir=/path/to/datadir &
这是启动第二台服务器用于测试的快速方法。这种方法的好处在于,环境变量设置适用于您从同一个shell调用的任何客户端程序。因此,这些客户端的连接会自动导向第二台服务器。
第4.9节“MySQL程序环境变量”包含了可用于影响MySQL程序的其他环境变量的列表。
在Unix上,mysqld_multi脚本提供了启动多个服务器的另一种方式。请参见 第4.3.4节“ mysqld_multi - 管理多个MySQL服务器”。
要将客户端程序连接到正在侦听编译到客户端的不同网络接口的MySQL服务器,可以使用以下方法之一:
启动客户端,
使用TCP / IP连接到远程服务器,
使用TCP / IP连接到本地服务器,或
使用Unix套接字文件或Windows命名管道连接到本地服务器。
--host=
host_name--port=port_number--host=127.0.0.1
--port=port_number--host=localhost
--socket=file_name
启动客户端
--protocol=TCP以使用TCP / IP
--protocol=SOCKET进行连接,使用Unix套接字文件
--protocol=PIPE进行连接,使用命名管道--protocol=MEMORY进行连接,或
使用共享内存进行连接。对于TCP / IP连接,您可能还需要指定--host和
--port选项。对于其他类型的连接,您可能需要指定一个
--socket选项来指定Unix套接字文件或Windows命名管道名称,或--shared-memory-base-name
指定共享内存名称的
选项。共享内存连接仅在Windows上受支持。
在Unix上,设置MYSQL_UNIX_PORT和
MYSQL_TCP_PORT环境变量启动您的客户端之前指向Unix套接字文件和TCP / IP端口号。如果您通常使用特定的套接字文件或端口号,则可以将命令设置为在您的.login文件中设置这些环境变量,以便在您每次登录时都应用这些变量。请参见
第4.9节“MySQL程序环境变量”。
在[client]选项文件组中指定默认的Unix套接字文件和TCP / IP端口号。例如,您可以C:\my.cnf在Windows上使用,也可以.my.cnf在Unix上的主目录中使用该文件。请参见第4.2.6节“使用选项文件”。
在C程序中,您可以在mysql_real_connect()调用中指定套接字文件或端口号参数
。您也可以通过调用程序来读取选项文件
mysql_options()。请参见
第27.8.7节“C API函数描述”。
如果您使用Perl DBD::mysql
模块,则可以从MySQL选项文件中读取选项。例如:
$ dsn =“DBI:mysql:test; mysql_read_default_group = client;”
。“MYSQL_READ_DEFAULT_FILE =的/ usr /本地/ MySQL的/数据/ my.cnf中”;
$ dbh = DBI-> connect($ dsn,$ user,$ password);
其他编程接口可以提供用于读取选项文件的类似功能。
在MySQL 5.7中不支持对DTrace的支持,并在MySQL 8.0中删除。
MySQL服务器中的DTrace探测器旨在提供有关MySQL内查询执行情况的信息以及在该过程中正在使用的系统的不同区域。探测器的组织和触发意味着可以使用一个级别的探测器(query-start和
query-done)来监视整个查询的执行,但是通过监视其他探测器,可以根据所使用的锁连续获得关于查询执行的更多详细信息,排序方法,甚至是逐行和存储引擎级的执行信息。
DTrace探针的组织方式使您可以跟踪整个查询过程,从客户端的连接点到查询执行,行级操作并再次返回。在典型的客户端连接/执行/断开序列期间,您可以将探测器视为在特定序列中被触发,如下图所示。
全局信息在各级DTrace探针的参数中提供。全球信息,那就是,连接ID和用户/主机并在相关查询字符串,在关键水平提供(connection-start,
command-start,query-start和query-exec-start)。随着您深入探查,假设您只对单个执行感兴趣(行级探测只提供有关数据库和表名的信息),或者您将行级探测与名义上的父级探测器提供有关特定查询的信息。将给出这样的例子,因为提供了每个探针的格式和参数。
MySQL在这些平台上支持DTrace探针:
SPARC,x86和x86_64平台上的Solaris 10 Update 5(Solaris 5/08)
OS X 10.4和更高版本
带有UEK内核的Oracle Linux 6和更高版本(从MySQL 5.7.5开始)
在这些平台上启用探针应该是自动的。要在构建过程中明确启用或禁用探针,请使用CMake的
-DENABLE_DTRACE=1或
-DENABLE_DTRACE=0选项
。
如果非Solaris平台包含DTrace支持,则在该平台上构建 mysqld将包含DTrace支持。
有关DTrace和编写DTrace脚本的更多信息,请阅读 DTrace用户指南。
有关DTrace的介绍,请参阅MySQL开发人员专区文章 DTracing MySQL入门。
MySQL支持以下静态探针,按功能分组。
表5.5 MySQL DTrace探针
| 组 | 探头 |
|---|---|
| 连接 | connection-start, connection-done |
| 命令 | command-start, command-done |
| 询问 | query-start, query-done |
| 查询分析 | query-parse-start,
query-parse-done |
| 查询缓存 | query-cache-hit, query-cache-miss |
| 查询执行 | query-exec-start, query-exec-done |
| 行级别 | insert-row-start, insert-row-done |
update-row-start, update-row-done |
|
delete-row-start, delete-row-done |
|
| 行读取 | read-row-start, read-row-done |
| 索引读取 | index-read-row-start,
index-read-row-done |
| 锁 | handler-rdlock-start,
handler-rdlock-done |
handler-wrlock-start,
handler-wrlock-done |
|
handler-unlock-start,
handler-unlock-done |
|
| 文件排序 | filesort-start, filesort-done |
| 声明 | select-start, select-done |
insert-start, insert-done |
|
insert-select-start,
insert-select-done |
|
update-start, update-done |
|
multi-update-start,
multi-update-done |
|
delete-start, delete-done |
|
multi-delete-start,
multi-delete-done |
|
| 网络 | net-read-start,net-read-done,
net-write-start,
net-write-done |
| Keycache | keycache-read-start,
keycache-read-block,
keycache-read-done,
keycache-read-hit,
keycache-read-miss,
keycache-write-start,
keycache-write-block,
keycache-write-done |
当从探测器中提取参数数据时,每个参数都可用作为
开始。为了确定它们提供的描述性名称中的每个参数,但必须使用相应的参数访问信息
。
argNarg0argN
无论连接是通过套接字还是网络连接
,connection-start和
connection-done探针都包含来自客户端的连接。
连接开始(connectionid,用户,主机) 连接完成(状态,连接ID)
connection-start:在客户端完成连接并成功登录/验证后触发。参数包含连接信息:
connectionid:unsigned
long包含连接ID。这Id与输出中
显示的进程ID相同
SHOW PROCESSLIST。
user:认证时使用的用户名。匿名用户的值将为空白。
host:客户端连接的主机。对于使用Unix套接字进行的连接,值将为空。
connection-done:触发与客户端的连接已关闭。参数是:
status:连接关闭时的状态。注销操作的值为0; 连接的任何其他终止都具有非零值。
connectionid:已关闭的连接的连接ID。
以下D脚本将量化和总结单个连接的平均持续时间,并提供计数,每60秒钟丢弃一次信息:
#!/ usr / sbin / dtrace -s
MYSQL * :::连接启动
{
self> start = timestamp;
}
MYSQL * :::连接-DONE
/自>开始/
{
@ = quantize((((timestamp - self> start)/ 1000000));
self> start = 0;
}
蜱60
{
printa(@);
}
在具有大量客户端的服务器上执行时,您可能会看到与此类似的输出:
1 57413:刻度-60
值-------------分配-------------计数
-1 | 0
0 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1 | 59
2 | 五
4 | 20
8 | 29
16 | 18
32 | 27
64 | 三十
128 | 11
256 | 10
512 | 1
1024 | 6
2048 | 8
4096 | 9
8192 | 8
16384 | 2
32768 | 1
65536 | 1
131072 | 0
262144 | 1
524288 | 0
命令探针在执行客户端命令之前和之后执行,包括可能在此期间执行的任何SQL语句。命令包括操作,例如数据库的初始化,COM_CHANGE_USER操作的使用
(由MySQL协议支持)以及对预处理语句的操作。其中许多命令仅由来自各种连接器(如PHP和Java)的MySQL客户端API使用。
命令启动(connectionid,命令,用户,主机) 命令完成的(状态)
command-start:将命令提交给服务器时触发。
connectionid:执行命令的客户端的连接ID。
command:表示已执行的命令的整数。下表显示了可能的值。
| 值 | 名称 | 描述 |
|---|---|---|
| 00 | COM_SLEEP | 内部线程状态 |
| 01 | COM_QUIT | 关闭连接 |
| 02 | COM_INIT_DB | 选择数据库(USE ...) |
| 03 | COM_QUERY | 执行查询 |
| 04 | COM_FIELD_LIST | 获取字段列表 |
| 05 | COM_CREATE_DB | 创建一个数据库(不建议使用) |
| 06 | COM_DROP_DB | 删除数据库(不建议使用) |
| 07 | COM_REFRESH | 刷新连接 |
| 08 | COM_SHUTDOWN | 关机服务器 |
| 09 | COM_STATISTICS | 获取统计信息 |
| 10 | COM_PROCESS_INFO | 获取进程(SHOW PROCESSLIST) |
| 11 | COM_CONNECT | 初始化连接 |
| 12 | COM_PROCESS_KILL | 杀死进程 |
| 13 | COM_DEBUG | 获取调试信息 |
| 14 | COM_PING | 平 |
| 15 | COM_TIME | 内部线程状态 |
| 16 | COM_DELAYED_INSERT | 内部线程状态 |
| 17 | COM_CHANGE_USER | 更改用户 |
| 18 | COM_BINLOG_DUMP | 由复制从机或mysqlbinlog使用以启动二进制日志读取 |
| 19 | COM_TABLE_DUMP | 由复制从服务器使用以获取主表信息 |
| 20 | COM_CONNECT_OUT | 由复制从站用于记录到服务器的连接 |
| 21 | COM_REGISTER_SLAVE | 在注册期间由复制从站使用 |
| 22 | COM_STMT_PREPARE | 准备一份声明 |
| 23 | COM_STMT_EXECUTE | 执行一个语句 |
| 24 | COM_STMT_SEND_LONG_DATA | 请求扩展数据时由客户端使用 |
| 25 | COM_STMT_CLOSE | 关闭准备好的声明 |
| 26 | COM_STMT_RESET | 重置准备好的语句 |
| 27 | COM_SET_OPTION | 设置一个服务器选项 |
| 28 | COM_STMT_FETCH | 获取准备好的声明 |
user:用户执行命令。
host:客户端主机。
command-done:命令执行完成时触发。所述status参数包含0,如果成功执行了命令,或1,如果该语句正常完成之前被终止。
在command-start与
command-done当与声明探头相结合,得到的总执行时间的想法探头最好使用。
在query-start与
query-done当服务器接收到一个特定的查询,在查询已完成,信息已成功发送给客户端探测器被触发。
查询开始(查询,连接ID,数据库,用户,主机) 查询完成的(状态)
query-start:在从客户端收到查询字符串后触发。参数是:
query:提交的查询的全文。
connectionid:提交查询的客户端的连接ID。连接ID等于客户端第一次连接时返回的连接ID和Id输出中的值SHOW
PROCESSLIST。
database:正在执行查询的数据库名称。
user:用于连接到服务器的用户名。
host:客户端的主机名。
query-done:一旦查询被执行并且信息已经被返回给客户端,触发。探测包括一个参数,
status当查询成功执行时返回0,如果发生错误返回1。
您可以使用以下D脚本获取每个查询的执行时间的简单报告:
#!/ usr / sbin / dtrace -s
#pragma D选项安静
的DTrace ::: BEGIN
{
printf(“% - 20s%-20s%-40s%-9s \ n”,“Who”,“Database”,“Query”,“Time(ms)”);
}
MYSQL * :::查询开始
{
self-> query = copyinstr(arg0);
self-> connid = arg1;
self-> db = copyinstr(arg2);
自我> who = strjoin(copyinstr(arg3),strjoin(“@”,copyinstr(arg4)));
self> querystart = timestamp;
}
MYSQL * :::查询-DONE
{
printf(“% - 20s%-20s%-40s%-9d \ n”,self> who,self-> db,self-> query,
(timestamp - self> querystart)/ 1000000);
}在执行上面的脚本时,您应该对查询的执行时间有一个基本的了解:
shell> ./query.d Who Database查询时间(毫秒) root @ localhost test select * from t1 order by i limit 10 0 root @ localhost测试集全局query_cache_size = 0 0 root @ localhost test select * from t1 order by i limit 10 776 root @ localhost test select * from t1 order by i limit 10 773 root @ localhost test select * from t1 order by i desc limit 10 795
在解析原始SQL语句之前以及解析语句并确定处理语句所需的执行模型已完成时触发查询解析探针:
查询解析启动(查询) 查询语法分析完成(状态)
query-parse-start:在语句被MySQL查询解析器解析之前触发。单个参数,query是一个包含原始查询全文的字符串。
query-parse-done:当原始语句的分析完成时触发。这
status是一个描述操作状态的整数。A 0表示查询已成功解析。A
1表示解析查询失败。
例如,您可以使用以下D脚本监视解析给定查询的执行时间:
#!/ usr / sbin / dtrace -s
#pragma D选项安静
MYSQL * :::查询解析启动
{
self> parsestart = timestamp;
self-> parsequery = copyinstr(arg0);
}
MYSQL * :::查询解析-DONE
/ arg0 == 0 /
{
printf(“Parsing%s:%d microseconds \ n”,self-> parsequery,((timestamp - self-> parsestart)/ 1000));
}
MYSQL * :::查询解析-DONE
/ arg0!= 0 /
{
printf(“解析%s时出错:%d微秒\ n”,self> parsequery,((timestamp - self-> parsestart)/ 1000));
}
在上面的脚本中使用谓词,
query-parse-done以便根据探针的状态值生成不同的输出。
运行脚本并监视执行时:
shell> ./query-parsing.d 错误解析t1中的选择连接(t2)on(t1.i = t2.i)order by t1.s,t1.i limit 10:36 ms 解析select * from t1 join(t2)on(t1.i = t2.i)order by t1.s,t1.i limit 10:176 ms
执行任何查询时会触发查询缓存探测。在
query-cache-hit当在查询缓存中存在的查询,可用于返回查询缓存信息查询被触发。参数包含原始查询文本以及查询缓存为查询返回的行数。如果查询不在查询缓存内,或者查询缓存未启用,则会
query-cache-miss触发探针。
query-cache-hit(查询,行) 查询高速缓存未命中(查询)
query-cache-hit:在查询缓存中找到查询时触发。第一个参数
query包含查询的原始文本。第二个参数rows是,包含缓存查询中行数的整数。
query-cache-miss:在查询缓存中未找到查询时触发。第一个参数query包含查询的原始文本。
查询缓存探针最好与主查询中的探针组合使用,以便您可以确定使用或不使用指定查询的查询缓存之间的时间差异。例如,在以下D脚本中,查询和查询缓存信息在监视期间合并到信息输出中:
#!/ usr / sbin / dtrace -s
#pragma D选项安静
的DTrace ::: BEGIN
{
printf(“% - 20s%-20s%-40s%2s%-9s \ n”,“Who”,“Database”,“Query”,“QC”,“Time(ms)”);
}
MYSQL * :::查询开始
{
self-> query = copyinstr(arg0);
self-> connid = arg1;
self-> db = copyinstr(arg2);
自我> who = strjoin(copyinstr(arg3),strjoin(“@”,copyinstr(arg4)));
self> querystart = timestamp;
自> qc = 0;
}
MYSQL * :::查询缓存命中
{
self> qc = 1;
}
MYSQL * :::查询缓存缺失
{
自> qc = 0;
}
MYSQL * :::查询-DONE
{
printf(“% - 20s%-20s%-40s%-2s%-9d \ n”,self> who,self> db,self-> query,(self-> qc?“Y”:“N” )
(timestamp - self> querystart)/ 1000000);
}在执行脚本时,您可以看到查询缓存的效果。最初查询缓存被禁用。如果设置查询缓存大小,然后多次执行查询,则应该看到查询缓存正在用于返回查询数据:
shell> ./query-cache.d root @ localhost test select * from t1 order by i limit 10 N 1072 root @ localhost set global query_cache_size = 262144 N 0 root @ localhost test select * from t1 order by i limit 10 N 781 root @ localhost test select * from t1 order by i limit 10 Y 0
在解析并检查查询缓存之后但在任何特权检查或优化之前,当查询的实际执行开始时,触发查询执行探测。通过比较开始和完成探测之间的差异,您可以监视实际用于查询的时间(而不仅仅是处理查询的解析和其他元素)。
query-exec-start(query,connectionid,database,user,host,exec_type) 查询EXEC-完成(状态)
在参数所提供的信息
query-start和
query-exec-start几乎是相同的,并设计成使得可以选择为监视整个查询处理(使用query-start)或仅执行(使用query-exec-start),同时暴露有关用户,客户端的核心信息和查询正在执行。
query-exec-start:在开始执行单个查询时触发。参数是:
query:提交的查询的全文。
connectionid:提交查询的客户端的连接ID。连接ID等于客户端第一次连接时返回的连接ID和Id输出中的值SHOW
PROCESSLIST。
database:正在执行查询的数据库名称。
user:用于连接到服务器的用户名。
host:客户端的主机名。
exec_type:执行的类型。执行类型根据查询内容和提交位置确定。下表显示了每种类型的值。
| 值 | 描述 |
|---|---|
| 0 | 从sql_parse,顶级查询执行查询。 |
| 1 | 执行准备好的声明 |
| 2 | 执行游标语句 |
| 3 | 在存储过程中执行查询 |
query-exec-done:在查询执行完成时触发。探测包括一个参数,status当查询成功执行时返回0,如果发生错误则返回1。
该*row-{start,done}探针分别由行操作被向下推到一个存储引擎时间触发。例如,如果您执行一个INSERT包含100行数据的
语句,那么对于每个行插入,insert-row-start和
insert-row-done探针将被触发100次。
插入行开始(数据库,表) 插排全熟(状态) 更新行开始(数据库,表) 更新行完成的(状态) 删除行开始(数据库,表) 删除行 - 完成(状态)
insert-row-start:在将行插入到表中之前触发。
insert-row-done:在将行插入到表中后触发。
update-row-start:在表格中更新行之前触发。
update-row-done:在表格中更新行之前触发。
delete-row-start:在从表格中删除行之前触发。
delete-row-done:在从表中删除行之前触发。
探针支持的参数对于每种情况下的相应start和
done探针是一致的:
database:数据库名称。
table:表名。
status:地位; 0表示成功或1表示失败。
由于行级别探测针对每个单独的行访问都会触发,因此这些探测可能每秒触发数千次,这可能会对监视脚本和MySQL产生不利影响。DTrace环境应限制对这些探测器的触发,以防止性能受到不利影响。要谨慎使用探针,或使用计数器或聚合函数来报告这些探针,然后在脚本终止时或作为一个query-done或多个
query-exec-done探针的一部分提供摘要。
以下示例脚本总结了较大查询中每个行操作的持续时间:
#!/ usr / sbin / dtrace -s
#pragma D选项安静
的DTrace ::: BEGIN
{
printf(“% - 2s%-10s%-10s%9s%9s%-s \ n”,
“St”,“Who”,“DB”,“ConnID”,“Dur ms”,“Query”);
}
MYSQL * :::查询开始
{
self-> query = copyinstr(arg0);
自我> who = strjoin(copyinstr(arg3),strjoin(“@”,copyinstr(arg4)));
self-> db = copyinstr(arg2);
self-> connid = arg1;
self> querystart = timestamp;
self> rowdur = 0;
}
MYSQL * :::查询-DONE
{
this-> elapsed =(timestamp - self> querystart)/ 1000000;
printf(“%2d%-10s%-10s%9d%9d%s \ n”,
arg0,self> who,self> db,
self> connid,this-> elapsed,self> query);
}
MYSQL * :::查询-DONE
/ self> rowdur /
{
printf(“%34s%9d%s \ n”,“”,(self> rowdur / 1000000),“ - > Row ops”);
}
MYSQL * :::插入行启动
{
self> rowstart = timestamp;
}
MYSQL * :::删除行启动
{
self> rowstart = timestamp;
}
MYSQL * :::更新行启动
{
self> rowstart = timestamp;
}
MYSQL * :::插入行-DONE
{
self> rowdur + =(timestamp-self> rowstart);
}
MYSQL * :::删除行-DONE
{
self> rowdur + =(timestamp-self> rowstart);
}
MYSQL * :::更新行-DONE
{
self> rowdur + =(timestamp-self> rowstart);
}
使用将数据插入表的查询运行上述脚本,可以监视执行原始行插入所花费的确切时间:
St Who DB ConnID Dur ms查询
0 @localhost测试13 20767插入到t1中(select * from t2)
4827 - >行操作
每次行读取操作发生时,在存储引擎级别触发读取行探测。这些探针是在每个存储引擎中指定的(而不是*row-start存储引擎接口中的
探针)。因此这些探测器可用于监视单个存储引擎的行级操作和性能。由于这些探测器是在存储引擎行读取接口周围触发的,因此在基本查询过程中可能会遇到很多次。
读取行开始(数据库,表,scan_flag) 读行完成的(状态)
read-row-start:当存储引擎从指定的database和读取行时触发
table。将scan_flag被设置为1(真)时读出的是一个表扫描的一部分(即,顺序读取),或0(假)当读出是一个特定的记录的。
read-row-done:在存储引擎中的行读取操作完成时触发。在
status成功返回0,在失败时正值。
每次使用指定表的其中一个索引读取行时,都会触发索引探测。探针在表格的相应存储引擎内被触发。
索引读取行开始(数据库,表) 索引读行完成的(状态)
index-read-row-start:当存储引擎从指定的database和读取行时触发
table。
index-read-row-done:当存储引擎中的索引行读取操作完成时触发。在status成功返回0,在失败时正值。
每当MySQL请求外部锁定时,就会调用锁定探测器,该表格使用表格引擎类型定义的表上相应的锁定机制。有三种不同类型的锁,即读锁,写锁定和解锁操作。使用探测器,您可以确定外部锁定例程的持续时间(即,存储引擎执行锁定所用的时间,包括等待另一个锁定变为空闲的时间)以及锁定/解锁过程的总持续时间。
handler-rdlock-start(数据库,表) 处理器-rdlock-完成(状态) handler-wrlock-start(数据库,表) 处理器-wrlock-完成(状态) 处理程序解锁启动(数据库,表) 处理器片解锁完成的(状态)
handler-rdlock-start:在指定的database和请求读锁定时触发
table。
handler-wrlock-start:在指定的database和要求写入锁定时触发
table。
handler-unlock-start:在指定的database和解锁请求上触发时触发
table。
handler-rdlock-done:读锁定请求完成时触发。status
如果锁定操作成功或>0失败,则该值为0
。
handler-wrlock-done:写入锁定请求完成时触发。status
如果锁定操作成功或>0失败,则该值为0
。
handler-unlock-done:解锁请求完成时触发。status如果解锁操作成功或>0失败,则该值为0
。
您可以使用数组来监视单个表的锁定和解锁,然后使用以下脚本计算整个表锁的持续时间:
#!/ usr / sbin / dtrace -s
#pragma D选项安静
MYSQL * :::处理-rdlock启动
{
自我> rdlockstart =时间戳;
this-> lockref = strjoin(copyinstr(arg0),strjoin(“@”,copyinstr(arg1)));
self> lockmap [this-> lockref] = self> rdlockstart;
printf(“开始:锁定 - >读取%s。%s \ n”,copyinstr(arg0),copyinstr(arg1));
}
MYSQL * :::处理-wrlock启动
{
self-> wrlockstart = timestamp;
this-> lockref = strjoin(copyinstr(arg0),strjoin(“@”,copyinstr(arg1)));
self> lockmap [this-> lockref] = self> rdlockstart;
printf(“开始:锁定 - >写入%s。%s \ n”,copyinstr(arg0),copyinstr(arg1));
}
MYSQL * :::处理器解锁启动
{
self-> unlockstart = timestamp;
this-> lockref = strjoin(copyinstr(arg0),strjoin(“@”,copyinstr(arg1)));
printf(“开始:锁定 - >解锁%s。%s(%d ms锁定持续时间)\ n”,
copyinstr(为arg0),copyinstr(ARG1),
(timestamp - self> lockmap [this-> lockref])/ 1000000);
}
MYSQL * :::处理-rdlock-完成
{
printf(“结束:锁定 - >读取%d ms \ n”,
(时间戳 - 自> rdlockstart)/ 1000000);
}
MYSQL * :::处理-wrlock-完成
{
printf(“结束:锁定 - >写入%d ms \ n”,
(timestamp - self> wrlockstart)/ 1000000);
}
MYSQL * :::处理程序,解锁完成
{
printf(“结束:锁定 - >解锁%d ms \ n”,
(timestamp - self-> unlockstart)/ 1000000);
}
执行时,您应该获得有关锁定进程本身的持续时间以及特定表上的锁定的信息:
开始:锁定 - >读取test.t2 结束:锁定 - >读取0毫秒 开始:锁定 - >解锁test.t2(25743 ms锁定持续时间) 结束:锁定 - >解锁0 ms 开始:锁定 - >读取test.t2 结束:锁定 - >读取0毫秒 开始:锁定 - >解锁test.t2(1 ms锁定持续时间) 结束:锁定 - >解锁0 ms 开始:锁定 - >读取test.t2 结束:锁定 - >读取0毫秒 开始:锁定 - >解锁test.t2(1 ms锁定持续时间) 结束:锁定 - >解锁0 ms 开始:锁定 - >读取test.t2 结束:锁定 - >读取0毫秒
只要将文件排序操作应用于表,就会触发filesort探针。有关filesort及其发生条件的更多信息,请参见 第8.2.1.13节“按优化排序”。
filesort-start(数据库,表格) filesort-done(状态,行)
filesort-start:在表上启动filesort操作时触发。这两个参数探测,database以及
table,将确定进行排序表。
filesort-done:在文件操作完成时触发。提供了两个参数,status(0表示成功,1表示失败)以及在文件输入过程中排序的行数。
下面的脚本就是一个例子,除了主查询的持续时间外,它还跟踪文件流程的持续时间:
#!/ usr / sbin / dtrace -s
#pragma D选项安静
的DTrace ::: BEGIN
{
printf(“% - 2s%-10s%-10s%9s%18s%-s \ n”,
“St”,“Who”,“DB”,“ConnID”,“Dur microsec”,“Query”);
}
MYSQL * :::查询开始
{
self-> query = copyinstr(arg0);
自我> who = strjoin(copyinstr(arg3),strjoin(“@”,copyinstr(arg4)));
self-> db = copyinstr(arg2);
self-> connid = arg1;
self> querystart = timestamp;
self-> filesort = 0;
self-> fsdb =“”;
self> fstable =“”;
}
MYSQL * :::文件排序启动
{
self-> filesort = timestamp;
自> fsdb = copyinstr(arg0);
self> fstable = copyinstr(arg1);
}
MYSQL * :::文件排序,做起来难
{
this-> elapsed =(timestamp - self-> filesort)/ 1000;
printf(“%2d%-10s%-10s%9d%18d文件位于%s \ n”,
arg0,self> who,self-> fsdb,
self> connid,this-> elapsed,self> fstable);
}
MYSQL * :::查询-DONE
{
this-> elapsed =(timestamp - self-> querystart)/ 1000;
printf(“%2d%-10s%-10s%9d%18d%s \ n”,
arg0,self> who,self> db,
self> connid,this-> elapsed,self> query);
}
使用ORDER
BY触发文件的子句在大型表上执行查询,然后在表上创建索引,然后重复相同的查询,可以看到执行速度的差异:
圣谁谁DB ConnID Dur microsec查询 0 @localhost测试14 11335469 t1上的Filesort 0 @localhost test 14 11335787 select * from t1 order by i limit 100 0 @localhost test 14 466734378在t1(i)上创建索引t1a 0 @localhost test 14 26472 select * from t1 order by i limit 100
提供单独的语句探针以提供有关不同语句类型的特定信息。对于开始探测,查询字符串作为唯一参数提供。根据报表类型,由相应完成的探针提供的信息将有所不同。对于所有完成的探测,都提供了操作的状态(0成功,
>0失败)。对于
SELECT,
INSERT,
INSERT ... (SELECT FROM
...),DELETE,和
DELETE FROM
t1,t2操作返回受影响的行数。
对于UPDATE和
UPDATE t1,t2
...语句匹配的行数和实际改变设置的行数。这是因为相应的WHERE子句实际匹配
的行数和更改的行数可能不同。如果该值已经与新设置匹配,则MySQL不更新行的值。
选择启动(查询) 选择全熟(状态行) 插入启动(查询) 插入-完成(状态行) 插入选启动(查询) 插入 - 选择 - 做(状态行) 更新启动(查询) 更新完成(状态,rowsmatched,rowschanged) 多次更新启动(查询) 多更新完成(状态,rowsmatched,rowschanged) 删除启动(查询) 删除-完成(状态行) 多删除启动(查询) 多 - 删除 - 完成(状态行)
select-start:在SELECT语句前触发
。
select-done:在SELECT语句结束时触发
。
insert-start:在INSERT语句前触发
。
insert-done:在INSERT语句结尾触发
。
insert-select-start:在INSERT ...
SELECT语句前触发
。
insert-select-done:在INSERT ...
SELECT语句结尾触发。
update-start:在UPDATE语句前触发
。
update-done:在UPDATE语句结尾触发
。
multi-update-start:在UPDATE涉及多个表的语句之前触发
。
multi-update-done:在UPDATE涉及多个表的语句结束时触发。
delete-start:在DELETE语句前触发
。
delete-done:在DELETE语句结束时触发
。
multi-delete-start:在DELETE涉及多个表的语句之前触发
。
multi-delete-done:在DELETE涉及多个表的语句结束时触发。
声明探针的参数是:
您可以使用这些探测器来监视这些语句类型的执行,而无需监视执行语句的用户或客户端。一个简单的例子就是跟踪执行时间:
#!/ usr / sbin / dtrace -s
#pragma D选项安静
的DTrace ::: BEGIN
{
printf(“% - 60s%-8s%-8s%-8s \ n”,“Query”,“RowsU”,“RowsM”,“Dur(ms)”);
}
mysql * ::: update-start,mysql * ::: insert-start,
mysql * ::: delete-start,mysql * ::: multi-delete-start,
mysql * ::: multi-delete-done,mysql * ::: select-start,
mysql * ::: insert-select-start,mysql * ::: multi-update-start
{
self-> query = copyinstr(arg0);
self> querystart = timestamp;
}
mysql * ::: insert-done,mysql * ::: select-done,
mysql * ::: delete-done,mysql * ::: multi-delete-done,mysql * ::: insert-select-done
/ self-> querystart /
{
this-> elapsed =((timestamp-self> querystart)/ 1000000);
printf(“% - 60s%-8d%-8d%d \ n”,
自我>查询,
0,
ARG1,
这 - >经过的);
self> querystart = 0;
}
mysql * ::: update-done,mysql * ::: multi-update-done
/ self-> querystart /
{
this-> elapsed =((timestamp-self> querystart)/ 1000000);
printf(“% - 60s%-8d%-8d%d \ n”,
自我>查询,
ARG1,
ARG2,
这 - >经过的);
self> querystart = 0;
}执行时,您可以看到基本的执行时间和行匹配:
查询RowsU RowsM Dur(ms) 从t2 0 275 0选择* 插入到t2(select * from t2)0 275 9 更新t2设置i = 5,其中i> 75 110 110 8 更新t2设置i = 5,其中i <25 254 134 12 从t2中删除,其中i <5 0 0 0
另一种方法是使用DTrace中的聚合函数将单个语句的执行时间聚合在一起:
#!/ usr / sbin / dtrace -s
#pragma D选项安静
mysql * ::: update-start,mysql * ::: insert-start,
mysql * ::: delete-start,mysql * ::: multi-delete-start,
mysql * ::: multi-delete-done,mysql * ::: select-start,
mysql * ::: insert-select-start,mysql * ::: multi-update-start
{
self> querystart = timestamp;
}
MYSQL * :::选择,做
{
@statements [“select”] = sum(((timestamp - self-> querystart)/ 1000000));
}
mysql * ::: insert-done,mysql * ::: insert-select-done
{
@statements [“insert”] = sum(((timestamp - self-> querystart)/ 1000000));
}
mysql * ::: update-done,mysql * ::: multi-update-done
{
@statements [“update”] = sum(((timestamp - self-> querystart)/ 1000000));
}
mysql * ::: delete-done,mysql * ::: multi-delete-done
{
@statements [“delete”] = sum(((timestamp - self-> querystart)/ 1000000));
}
勾选-30S
{
printa(@statements);
}
刚刚显示的脚本汇总了每次操作花费的时间,可用于帮助基准测试的标准套件。
删除0 更新0 插入23 选择2484 删除0 更新0 插入39 选择10744 删除0 更新26 插入56 选择10944 删除0 更新26 插入2287 选择15985
网络探测器通过网络监控来自MySQL服务器和所有类型客户端的信息传输。探针定义如下:
净读取开始() net-read-done(状态,字节) 净写开始(字节) 净写完成的(状态)
net-read-start:当网络读取操作开始时触发。
net-read-done:在网络读取操作完成时触发。这status是integer代表操作的返回状态,0用于成功和
1失败。所述
bytes参数是一个整数,指定过程中读取的字节数。
net-start-bytes:当数据写入网络套接字时触发。单参数
bytes指定写入网络套接字的字节数。
net-write-done:网络写入操作完成时触发。单个参数,
status是一个表示操作返回状态的整数,0用于成功和1失败。
您可以使用网络探测器来监视执行期间读取和写入网络客户端的时间。以下D脚本提供了一个例子。计算读取或写入的累计时间以及字节数。请注意,动态变量大小已增加(使用dynvarsize选项)以应对网络读取/写入的各个探测器的快速触发。
#!/ usr / sbin / dtrace -s
#pragma D选项安静
#pragma D选项dynvarsize = 4m
的DTrace ::: BEGIN
{
printf(“% - 2s%-30s%-10s%9s%18s%-s \ n”,
“St”,“Who”,“DB”,“ConnID”,“Dur microsec”,“Query”);
}
MYSQL * :::查询开始
{
self-> query = copyinstr(arg0);
自我> who = strjoin(copyinstr(arg3),strjoin(“@”,copyinstr(arg4)));
self-> db = copyinstr(arg2);
self-> connid = arg1;
self> querystart = timestamp;
self> netwrite = 0;
self> netwritecum = 0;
self> netwritebase = 0;
self> netread = 0;
self> netreadcum = 0;
self> netreadbase = 0;
}
MYSQL * :::净写开始
{
self> netwrite + = arg0;
self> netwritebase = timestamp;
}
MYSQL * :::净写做
{
self> netwritecum + =(timestamp - self> netwritebase);
self> netwritebase = 0;
}
MYSQL * :::净读取开始
{
self> netreadbase = timestamp;
}
MYSQL * :::网络读取-DONE
{
self> netread + = arg1;
self> netreadcum + =(timestamp - self> netreadbase);
self> netreadbase = 0;
}
MYSQL * :::查询-DONE
{
this-> elapsed =(timestamp - self> querystart)/ 1000000;
printf(“%2d%-30s%-10s%9d%18d%s \ n”,
arg0,self> who,self> db,
self> connid,this-> elapsed,self> query);
printf(“净读:%d个字节(%d ms)写:%d个字节(%d ms)\ n”,
self> netread,(self> netreadcum / 1000000),
self> netwrite,(self> netwritecum / 1000000));
}在具有远程客户端的计算机上执行上述脚本时,您可以看到执行查询所用时间的大约三分之一与将查询结果写回客户端有关。
圣谁谁DB ConnID Dur microsec查询 0 root @ :: ffff:198.51.100.108 test 31 3495 select * from t1 limit 1000000 净读取:0字节(0毫秒)写入:10000075字节(1220毫秒)
使用与MyISAM存储引擎一起使用的索引键缓存时会触发键缓存探测。存在探测器来监视将数据读入密钥缓存的时间,将缓存的密钥数据从缓存写入缓存文件或访问密钥缓存时。
Keycache用法指示何时将数据从索引文件读取或写入缓存,并可用于监视分配给keycache的内存使用效率。在一系列查询中大量的keycache读取可能表明keycache对于访问数据的大小而言太小。
keycache-read-start(文件路径,字节,mem_used,mem_free) keycache读取块(字节) keycache读取命中() keycache读错过() keycache-read-done(mem_used,mem_free) keycache-write-start(文件路径,字节,mem_used,mem_free) keycache写入块(字节) keycache-write-done(mem_used,mem_free)
当从索引文件读取数据到keycache中时,进程首先初始化读取操作(表示为
keycache-read-start),然后加载数据块(keycache-read-block),然后读取块或者与正在标识的数据(keycache-read-hit)或更多数据相匹配被读取(keycache-read-miss)。一旦读操作完成,阅读停止
keycache-read-done。
仅当指定的密钥不在密钥缓存中时,才会将数据从索引文件读取到密钥缓存中。
keycache-read-start:当keycache读操作开始时触发。数据是从指定的filepath读取,读取指定的数量bytes。The
mem_used和mem_avail
表示keycache当前使用的内存以及keycache中可用的内存量。
keycache-read-block:当keycache bytes从索引文件读取指定数量的数据块
到keycache中时触发。
keycache-read-hit:当从索引文件读取的数据块与请求的关键数据匹配时触发。
keycache-read-miss:当从索引文件读取的数据块与所需的关键数据不匹配时触发。
keycache-read-done:当keycache读取操作完成时触发。The
mem_used和mem_avail
表示keycache当前使用的内存以及keycache中可用的内存量。
Keycache写道:当索引信息的过程中发生的更新INSERT,UPDATE或DELETE操作和缓存的关键信息被冲回索引文件。
keycache-write-start:在启动keycache写入操作时触发。数据写入指定的filepath,读取指定的数量bytes。The
mem_used和mem_avail
表示keycache当前使用的内存以及keycache中可用的内存量。
keycache-write-block:当keycache将指定数量的数据块写入keycache
bytes的索引文件时触发。
keycache-write-done:当keycache写入操作完成时触发。The
mem_used和mem_avail
表示keycache当前使用的内存以及keycache中可用的内存量。